我正在阅读Clojure Programming书,并按照示例进行操作。但是我遇到了一个错误。
(defn print-logger
[writer]
#(binding [*out* writer]
(println %)))
(def *out*-logger (print-logger *out*))
(*out*-logger "hello")
将导致:`无法动态绑定非动态var:user / out
我对Clojure很新,并且不明白为什么会发生这种情况,特别是在我关注这个例子时:)
答案 0 :(得分:5)
问题不在您的代码示例中。
*out*
应该引用clojure.core/*out*
,所以如果你在repl中运行它,你可能已经运行了一些先前的东西,比如(def *out* something)
来创建一个{{1} }}
然后,当您定义user/*out*
函数时,print-logger
语句将尝试重新绑定(binding [*out* writer] ...)
而不是user/*out*
。
您可以使用ns-unmap
从命名空间中删除clojure.core/*out*
。
user/*out*
您还需要再次定义(ns-unmap 'user '*out*) ;; => nil
功能,以重新获得正确的print-logger
。