如何使用parenscript将Lisp列表设置为JavaScript变量的值?

ˆᵛˆ*_*ˆᵛˆ 2 common-lisp 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数组变量赋值语句的正确方法是什么?

Sva*_*nte 6

我能用1000000件物品重现这个.似乎parenscript编译器(位于该ps宏后面)首先将您的列表转换为表单(array 1 2 3 4 5 …).这意味着array获得了一百万个参数,这对于源代码来说是相当不寻常的.

我建议考虑你的设计.为什么要在源代码中创建这么大的向量?它应该位于单独的文件中,还是通过网络在运行时加载?

顺便说一句,你可以使用你在错误时抛出的调试器来检查发生了什么.例如,在SLIME中,我按下v框架compile-special-form以查看相应的parenscript源代码.这显示了以下表达式:

(apply expression-impl (cdr form))
Run Code Online (Sandbox Code Playgroud)

这表明表达将受制于call-arguments-limit.