【问题标题】:How to set a Lisp list as the value of a JavaScript variable using parenscript?如何使用 parenscript 将 Lisp 列表设置为 JavaScript 变量的值?
【发布时间】:2018-10-10 03:10:44
【问题描述】:

我有:

(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* 很大时,评估会导致错误:

错误:参数过多。 执行时:PARENSCRIPT::COMPILE-SPECIAL-FORM,在进程监听器(1)中。

如何解决此错误?


不知道 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 数组变量赋值语句的正确方法是什么?

【问题讨论】:

  • “大”有多大?

标签: common-lisp parenscript


【解决方案1】:

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

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

顺便说一句,您可以使用出错时遇到的调试器来检查正在发生的事情。比如在 SLIME 中,我在compile-special-form 的框架上按了v,可以看到parenscript 对应的源码。这显示了以下表达式:

(apply expression-impl (cdr form))

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

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多