parenscript宏是否等效于macroexpand或macroexpand-1?做(ps (some macro expression))
会显示生成的javascript,但有时候在它转换为javascript之前看到parenscript会很高兴.
以下代码将第三方生成的 javascript 插入为需要评估的字符串。
(ps (let ((x (lisp (json:encode-json-alist-to-string
'((:a . 1) (:b . 2))))))))
"(function () {
var x = '{\"a\":1,\"b\":2}';
return null; })();"
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉 parenscript 插入未加引号的字符串?
我有:
(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数组变量赋值语句的正确方法是什么?