我有这个启动并执行函数的Clojure代码。
(import [java.lang Thread])
(defn with-new-thread [f]
(.start (Thread. f)))
(with-new-thread (fn [] (print "hi")))
但是,当我在slime-repl模式的emacs中运行它时(用cider-jack-in
执行),没有打印出来,但是nil返回了。
使用lein real
,我得到了预期的输出。
user=> (import [java.lang Thread])
java.lang.Thread
user=> (defn with-new-thread [f] (.start (Thread. f)))
#'user/with-new-thread
user=> (with-new-thread (fn [] (print "hello\n")))
hello
nil
可能出现什么问题?
答案 0 :(得分:9)
这是因为CIDER / Emacs中的主线程将REPL输出缓冲区绑定到*out*
动态var。这就是为什么你可以在emacs中看到的东西。
但是,当您启动新线程时,该绑定不存在。修复很简单 - 首先创建一个捕获当前绑定的函数:
(def repl-out *out*)
(defn prn-to-repl [& args]
(binding [*out* repl-out]
(apply prn args)))
现在,只要您想从其他线程打印,请使用:
(prn-to-repl "hello")
就是这样。希望这可以帮助。