3

我在浏览器中运行了一个 Clojurescript 程序。

它导入了许多库,然后我想让用户输入一些调用这些库的小型 clojurescript “胶水代码”。

我可以看到(来自https://cljs.github.io/api/cljs.js/eval)你用四个参数调用 eval ,第一个是环境的状态,它是一个原子。但是我真的可以将我当前的环境以及我从其他地方需要的所有功能变成一个合适的 eval 参数吗?

更新 :

我想也许我可以使用第三个参数 opts-map 的 :ns 选项为 eval 设置命名空间。我将它设置为我的应用程序的命名空间:

:ns "fig-pat.core"

但没有区别。

查看控制台,它肯定是在尝试进行评估,但它抱怨在评估代码中引用的名称无法识别:

WARNING: Use of undeclared Var /square

例如。(正方形是我需要的功能。它在应用程序本身中可见,即 fig-pat.core 命名空间)

然后我得到:

SyntaxError: expected expression, got '.'[Learn More]

我假设这是 eval-ed 表达式作为一个整体的失败。

更新 2:

我猜这个问题实际上可能与:如何从 clojurescript 程序中获取我所在的 Clojurescript 命名空间?

(println *ns*)

只是打印零。所以也许 Clojurescript 看不到它自己的命名空间。

因此 :ns 中的 eval 不起作用?

4

1 回答 1

3

在 clojurescript 程序中调用eval是所谓的“自托管 clojurescript”的一部分。在自托管 clojurescript 中,除非您实施解析策略,否则名称空间不可用。这意味着必须让浏览器知道如何解析命名空间,例如从 cdn 加载 cljs 文件。

正确实现命名空间解析并不是那么简单。load-fn这在from cljs.js namespace的文档字符串中以一种神秘的方式进行了解释。

一些工具支持在浏览器中运行的自托管 cljs 中解析命名空间,例如Klipsecrepl

于 2017-10-23T12:14:50.930 回答