我有:
(ps:ps (ps:var vertices (ps:lisp (cons 'list *VERTICES*))))
Run Code Online (Sandbox Code Playgroud)
其评估结果为:
"var vertices = [0.0, -200.0, 0, ... 0.4, 40];"
Run Code Online (Sandbox Code Playgroud)
这是正确的预期结果.
哪里:
ps
指的是parenscript(完整文档在这里).
*VERTICES*
在我的全局Lisp环境中,它只是一个简单的数字列表
但是,当*VERTICES*
大时,评估会导致错误:
错误:参数太多.在进程监听器(1)中执行:PARENSCRIPT :: COMPILE-SPECIAL-FORM.
我该如何解决这个错误?
不知道parenscript如何在内部真正起作用,这个问题很难解决.所以我尝试改变列表传递给ps的方式.
以下是一些失败的尝试:
(ps:ps (ps:var vertices (ps:lisp (list *VERTICES*))))
=> "var vertices = 1(2, 3, 4, 0, 9, 0.1)();"
(ps:ps (ps:var vertices (ps:lisp *VERTICES*)))
=> "var vertices = 1(2, 3, 4, 0, 9, 0.1);"
(ps:ps (ps:var vertices *VERTICES*))
=> "var vertices = VERTICES;"
Run Code Online (Sandbox Code Playgroud)
没有正确的预期输出.
将Lisp列表变量的值传递给parenscript以形成正确的javascript数组变量赋值语句的正确方法是什么?
在一个CCL REPL中,我输入:
(WITH-OPEN-SOCKET (socket :LOCAL-PORT 6667
:LOCAL-HOST "localhost"
:CONNECT :PASSIVE
:REUSE-ADDRESS t)
(let ((stream (ACCEPT-CONNECTION socket :wait t)))
(format stream "hello from server.~%")))
Run Code Online (Sandbox Code Playgroud)
它等待连接.
在另一个CCL流程中,我输入:
(WITH-OPEN-SOCKET (socket-stream :REMOTE-PORT 6667
:REMOTE-HOST "localhost"
:CONNECT :ACTIVE
:REUSE-ADDRESS t)
(format t (READ-LINE socket-stream)))
Run Code Online (Sandbox Code Playgroud)
此时此过程进入等待状态.它既不从服务器读取也不退出.
但是,当客户端连接到服务器时,服务器将以NIL退出.很明显,至少建立了一个连接,但字符串"Hello from server".永远不会沟通.
我相信这是我忽略的基本内容.如何发送消息?READ-LINE不是从流中读取的正确方法吗?我从服务器上写错了吗?如何建立基于双向简单字符串的通信?
我有:
(defmacro test (a b c)
`'(,a ,b ,c))
Run Code Online (Sandbox Code Playgroud)
跑步(test apple banana cuba)
给了(APPLE BANANA CUBA)
预期.
如何让宏生成APPLEBANANACUBA?
我试过了:
(defmacro test (a b c)
`'(,a,b,c))
Run Code Online (Sandbox Code Playgroud)
但(test ant bites chris)
仍然运行仍然返回(ANT BITES CHRIS)
三个单独的args列表.
我试过变化,似乎没有工作.像这个:
(defmacro test (a b c)
`(apply #'concatenate 'symbol '(,a ,b ,c)))
Run Code Online (Sandbox Code Playgroud)
显然,这会出错,因为'符号不是连接的有效输出类型.
我确信这是我对宏如何工作的一些基本误解,并且有一种简单的方法可以做到这一点.我错过了什么?
跑步(cl-json:encode-json-to-string 'ctx)
给"\"ctx\""
我需要的"ctx"
不是"\"ctx\""
.
我可以使用cl-ppcre并删除字符串中匹配的双引号.然而,这似乎有点矫枉过正.有没有其他方法可以做到这一点?
我有:
(defmacro assign (name value)
(format t "assigning ~A to ~A~%" `,name `,value))
(defun opcode-call (&rest args)
(mapcar (lambda (arg)
(if (stringp arg)
(let ((var (gensym)))
(assign var arg)
var)
arg))
args))
Run Code Online (Sandbox Code Playgroud)
当我编译操作码调用时,REPL输出:
assigning VAR to ARG
OPCODE-CALL
Run Code Online (Sandbox Code Playgroud)
为什么在编译时对赋值进行求值?
我有时会将函数调用及其输出的示例放在函数定义的文档字符串中.
(defun js-[] (&rest args)
"Javascript array literal statement.
(js-[] 1 2 3)
> \"[1, 2, 3]\"
"
(format nil "[~{~A~^, ~}]" (mapcar #'js-expr args)))
Run Code Online (Sandbox Code Playgroud)
但有时函数的输出是一个字符串.所以我必须在示例输出中转义双引号.这很快就变得单调乏味.
有没有办法将文档字符串分隔符从双引号更改为其他内容,以便我不必继续转义它们?
请注意,有时它比只逃避一次更糟糕:
(defun js-~ (str)
"Javascript string statement. This is needed so that double quotes are inserted.
(js-~ \"string\")
> \"\\\"string\\\"\"
"
(format nil "\"~A\"" str))
Run Code Online (Sandbox Code Playgroud)
这里还有一个问题.阅读文档很困难.
common-lisp ×6
ccl ×2
buffered ×1
lisp-macros ×1
macros ×1
parenscript ×1
sockets ×1
string ×1