我有:
(ps:ps (ps:var vertices (ps:lisp (cons 'list *VERTICES*))))
评估为:
"var vertices = [0.0, -200.0, 0, ... 0.4, 40];"
这是正确的预期结果。
其中:
ps
是指parenscript(完整文档为here)。
*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;"
没有正确的预期输出。
将Lisp列表变量的值传递给parenscript以形成正确的javascript数组变量赋值语句的正确方法是什么?
答案 0 :(得分:6)
我能用1000000件物品重现这一点。似乎parenscript编译器(位于ps
宏后面)首先将您的列表转换为表单(array 1 2 3 4 5 …)
。这意味着array
获得了一百万个参数,这对于源代码来说是相当不寻常的。
我建议您考虑一下您的设计。为什么要在源代码中创建这么大的向量?它应该位于单独的文件中,还是通过网络在运行时加载?
顺便说一下,你可以使用你在错误时抛出的调试器来检查发生了什么。例如,在SLIME中,我在v
的框架上按compile-special-form
以查看相应的parenscript源代码。这显示了以下表达式:
(apply expression-impl (cdr form))
表明表达式将受call-arguments-limit
。