我在浏览器中运行了一个Clojurescript程序。
它导入了许多库,然后我想让用户输入一些小的clojurescript" glue-code"它会调用这些库。
我可以看到(来自https://cljs.github.io/api/cljs.js/eval)你用四个参数调用eval,第一个是环境的状态,它是一个原子。但是,我是否可以将我当前的环境与我从其他地方需要的所有功能转变为适当的eval参数?
更新:
我想也许我可以使用第三个opts-map参数的:ns选项为eval设置name空间。我将它设置为我的应用程序的命名空间:
:ns "fig-pat.core"
但没有区别。
查看控制台,它确实是在尝试进行评估的情况,但是他们抱怨在评估代码中引用的名称无法识别:
WARNING: Use of undeclared Var /square
例如,。 (square是我需要的函数。它在应用程序本身中可见,即fig-pat.core命名空间)
然后我得到:SyntaxError: expected expression, got '.'[Learn More]
我认为这是整个评估表达失败的原因。
更新2:
我猜这个问题可能实际上与:How can I get the Clojurescript namespace I am in from within a clojurescript program?
有关(println *ns*)
只是打印nil。所以也许Clojurescript无法看到自己的命名空间。
因此:在eval中的ns不起作用?
答案 0 :(得分:2)
在clojurescript程序中调用eval
是所谓的“自托管clojurescript”的一部分。
在自托管的clojurescript中,除非您实施解析策略,否则名称空间不可用。这意味着必须让浏览器知道如何解析命名空间,例如从cdn加载cljs文件。
正确实现名称空间解析并非易事。
这在load-fn
的{{1}}文档字符串中以一种神秘的方式进行了解释。
多个工具支持在浏览器中运行的自主机clj中解析名称空间,例如cljs.js namespace和Klipse