我已经安装了samestep/boot-refresh 0.1.0。在启动 REPL中,当我更改源文件并键入:
boot.user=> (boot (refresh))
我得到:
java.lang.IllegalStateException: Can't set!: *e from non-binding thread
我究竟做错了什么?
这是完整的堆栈跟踪:
boot.user=> *e
#error {
:cause "Can't set!: *e from non-binding thread"
:via
[{:type java.lang.IllegalStateException
:message "Can't set!: *e from non-binding thread"
:at [clojure.lang.Var set "Var.java" 218]}]
:trace
[[clojure.lang.Var set "Var.java" 218]
[clojure.tools.namespace.repl$print_and_return invokeStatic "repl.clj" 22]
[clojure.tools.namespace.repl$print_and_return invoke "repl.clj" 20]
[clojure.tools.namespace.repl$do_refresh invokeStatic "repl.clj" 96]
[clojure.tools.namespace.repl$do_refresh invoke "repl.clj" 82]
[clojure.tools.namespace.repl$refresh invokeStatic "repl.clj" 145]
[clojure.tools.namespace.repl$refresh doInvoke "repl.clj" 128]
[clojure.lang.RestFn invoke "RestFn.java" 397]
[samestep.boot_refresh$eval541$fn__542$fn__547$fn__548$fn__549 invoke "boot_refresh.clj" 14]
[clojure.lang.AFn applyToHelper "AFn.java" 152]
[clojure.lang.AFn applyTo "AFn.java" 144]
[clojure.core$apply invokeStatic "core.clj" 646]
[clojure.core$with_bindings_STAR_ invokeStatic "core.clj" 1881]
[clojure.core$with_bindings_STAR_ doInvoke "core.clj" 1881]
[clojure.lang.RestFn invoke "RestFn.java" 425]
[samestep.boot_refresh$eval541$fn__542$fn__547$fn__548 invoke "boot_refresh.clj" 13]
[boot.core$run_tasks invoke "core.clj" 1019]
[boot.core$boot$fn__918 invoke "core.clj" 1029]
[clojure.core$binding_conveyor_fn$fn__4676 invoke "core.clj" 1938]
[clojure.lang.AFn call "AFn.java" 18]
[java.util.concurrent.FutureTask run "FutureTask.java" 266]
[java.util.concurrent.ThreadPoolExecutor runWorker "ThreadPoolExecutor.java" 1142]
[java.util.concurrent.ThreadPoolExecutor$Worker run "ThreadPoolExecutor.java" 617]
[java.lang.Thread run "Thread.java" 745]]}
堆栈跟踪中没有提到我自己的代码。我以前看过(boot (refresh))
REPL 的工作,但我无法找出我正在做的不同导致此错误的原因。
更新 1
在使用许多打印语句进行长时间的二进制搜索之后——正如@amalloy 的回答中所解释的那样,真正异常的堆栈跟踪是不可访问的——我发现了这一点:
在名为 的命名空间move-test
中,此语句:
(def subset-sum-spec fargish.workspace-test/subset-sum-spec)
导致(boot (refresh))
失败。当我将其替换为:
(:require … [fargish.workspace-test :refer [subset-sum-spec]] …)
在ns
声明中,(boot (refresh))
再次工作。这暂时解决了当前的问题,但我仍然想知道发生了什么。
更新 2
继续尝试开始(boot (refresh))
工作,很明显问题每次都不一样。@amalloy 的回答表明,这个问题的真正答案是找到ctnrepl/print-and-return无法存储的异常和堆栈跟踪的某种方式*e
。我尝试了一些想法,但相关变量似乎是私有的,很难挖掘出来。
如何找出导致(boot (refresh))
失败的错误?