免责声明:ClojureScript的新手
问题的上下文是这个文件(其中一个例子来自" Up and Running"书中添加了我自己的一些内容)。具体来说,问题是关于最后两行,你可以忽略其余部分。
(ns hello-compiler.hello)
(defn ^:export main []
(.write js/document "<h1>Hello, ClojureScript compiler!</h1>"))
(defn asum [a b]
(+ a b))
(enable-console-print!)
(println "hello.cljs loaded successfully")
第二行到最后一行是必要的,以使最后一行在浏览器中工作,否则CLJS-to-JS编译器生成的代码不知道如何打印东西:
if (cljs.core._STAR_print_fn_STAR_ == null) {
throw new Error("No *print-fn* fn set for evaluation environment");
,所以我需要它来运行最后一行(println)。所有前面的表达式都得到了很好的评估,并产生了预期的输出,即我在浏览器屏幕上看到了问候语,我能够运行 hello_compiler.hello.asum(2,3)。使用倒数第二行,我也得到了#34;文件已成功加载&#34;在浏览器控制台中。
但是当我像这样运行服务器端REPL时:
rlwrap lein trampoline cljsbuild repl-rhino
并加载文件:
(load-file&#34; src / cljs / hello_compiler / hello.cljs&#34;)
,我没有看到(println ...)中的消息。事实上,如果我手动从REPL尝试(println ..),我会得到一个例外:
org.mozilla.javascript.EcmaError: ReferenceError: "console" is not defined.
(它没有显示在加载文件中,可能会转到其他地方)。
当然,在运行(load-file ...)之前,我可以在REPL中手动(println ...)。 enable-console-print!似乎在浏览器中有所帮助,但在REPL中禁用了打印功能。同样地,没有 enable-console-print!,(println ...)在REPL中工作正常,无论是手动还是加载文件。它正在阅读纯粹的CLJS,而不是编译成JS,可能......
所以问题是 - 有没有办法让它在两个方面都有效?我可以将.cljs文件加载到本地REPL中,并且具有与我在浏览器中看到的相同的行为,它将编译后的文件加载到JS版本中?我知道Rhino REPL没有一个控制台&#39;就像浏览器一样,但是...当我运行节点时,它以某种方式设法弄清楚我的意思是console.log =)如果没有,有人可以指出为什么我期待这样的行为是不合理? 谢谢!
答案 0 :(得分:0)