ClojureScript - 浏览器和rhino repl之间的控制台和打印

时间:2017-12-27 04:04:34

标签: javascript clojurescript read-eval-print-loop rhino

免责声明: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,可能......

所以问题是 - 有没有办法让它在两个方面都有效?我可以将.cl​​js文件加载到本地REPL中,并且具有与我在浏览器中看到的相同的行为,它将编译后的文件加载到JS版本中?我知道Rhino REPL没有一个控制台&#39;就像浏览器一样,但是...当我运行节点时,它以某种方式设法弄清楚我的意思是console.log =)如果没有,有人可以指出为什么我期待这样的行为是不合理? 谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,我想我找到了自己问题的答案。我越是想到它,我就越怀疑期望Rhino“必须”拥有一个控制台对象,这对于enable-console-print来说会很好!码。所以我尝试了不同的repl,并将 [org.bodil / lein-noderepl“0.1.11”] 添加到我的:plugins 。然后,使用该REPL,我在浏览器和REPL中同时使用相同的代码处理所有内容。