Я установил 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 предполагает, что реальным ответом на этот вопрос будет какой-то способ найти исключение и трассировку стека, которые c.t.n.repl/print- and-return не может сохранить в *e
. Я попробовал несколько идей, но соответствующие переменные кажутся частными и их трудно найти.
Как узнать ошибку, которая приводит к сбою (boot (refresh))
?