ClojureScript - 浏览器和 rhino repl 之间的控制台和打印
ClojureScript - console and printing between browser and rhino repl
免责声明: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) 。在倒数第二行,我还在浏览器控制台中获得了 "file got loaded successfully"。
但是当我 运行 像这样的服务器端 REPL 时:
rlwrap lein trampoline cljsbuild repl-rhino
并像这样加载文件:
(load-file "src/cljs/hello_compiler/hello.cljs")
,我没有在 (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 没有像浏览器那样的 'console',但是......当我 运行 'node' 时,它设法弄清楚我所说的 [=46] 是什么意思=] =) 如果不是,有人可以指出为什么我期望这种行为是不合理的吗?
谢谢!
好的,我想我找到了我自己问题的答案。我想得越多,我就越怀疑期望 Rhino "must" 有一个控制台对象是不合理的,它可以使用 enable-console-print!代码。所以我尝试了不同的 repl,并将 [org.bodil/lein-noderepl "0.1.11"] 添加到我的 :plugins 中。然后,使用该 REPL,我可以同时使用相同的代码在浏览器和 REPL 中运行所有内容。
免责声明: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) 。在倒数第二行,我还在浏览器控制台中获得了 "file got loaded successfully"。
但是当我 运行 像这样的服务器端 REPL 时:
rlwrap lein trampoline cljsbuild repl-rhino
并像这样加载文件:
(load-file "src/cljs/hello_compiler/hello.cljs")
,我没有在 (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 没有像浏览器那样的 'console',但是......当我 运行 'node' 时,它设法弄清楚我所说的 [=46] 是什么意思=] =) 如果不是,有人可以指出为什么我期望这种行为是不合理的吗? 谢谢!
好的,我想我找到了我自己问题的答案。我想得越多,我就越怀疑期望 Rhino "must" 有一个控制台对象是不合理的,它可以使用 enable-console-print!代码。所以我尝试了不同的 repl,并将 [org.bodil/lein-noderepl "0.1.11"] 添加到我的 :plugins 中。然后,使用该 REPL,我可以同时使用相同的代码在浏览器和 REPL 中运行所有内容。