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

问题描述 投票:0回答:1

免责声明: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)。使用倒数第二行,我还在浏览器控制台中获得“文件已成功加载”。

但是,当我像这样运行服务器端REPL时:

rlwrap line trampoline cljsbuild repl-rhino

并加载文件,如下所示:

(load-file“src / cljs / hello_compiler / hello.cljs”)

,我没有看到(println ...)中的消息。事实上,如果我手动从REPL尝试(println ..),我会得到一个例外:

org.mozilla.javascript.EcmaError: ReferenceError: "console" is not defined.

(它没有显示在加载文件中,可能会转到其他地方)。

当然,在我运行(加载文件...)之前,我可以在REPL中手动(println ...)。使控制台打印!似乎在浏览器中有所帮助,但在REPL中禁用了打印功能。同样,如果没有enable-console-print!,(println ...)在REPL中工作正常,无论是手动还是加载文件。它正在阅读纯粹的CLJS,而不是编译成JS,可能......

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

javascript clojurescript read-eval-print-loop rhino
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.