【发布时间】:2016-10-15 19:20:34
【问题描述】:
我在源文件中定义的命名空间中有一个动态变量,如下所示:
(ns mystuff.log ...)
(def ^:dynamic *logging* #{})
我希望能够set! REPL 中的这个 var,以便同一个源文件中的代码可以查看它。在此示例中,mystuff.log/log 宏查看 *logging* 以决定是否打印给定的表达式。在 REPL 中,(set! *logging* #{:whatever}) 会很方便,在会话期间多次更改其值。
我怎样才能让 Leiningen 的 REPL 允许这样做?默认情况下,set!ing 这样的 var 会产生 IllegalStateException,因为 set! 无法更改 var 的根绑定。 var 必须是线程本地的,才能被set! 更改。
有没有办法告诉 Leiningen 像这样包装它的 REPL,为 var 创建一个线程本地绑定?
(binding [mystuff.log/*logging* mystuff.log/*logging*]
(the-leiningen-repl ...))
:repl-options 的:init 选项,简要解释了here,似乎提供了一些接近的东西。但显然,REPL 调用了:init,这使得为输入到 REPL 中的表达式建立线程本地绑定为时已晚。
【问题讨论】:
标签: clojure leiningen read-eval-print-loop thread-local