无法动态绑定非动态var:user / * out *

时间:2013-11-02 16:09:22

标签: clojure clojure-java-interop

我正在阅读Clojure Programming书,并按照示例进行操作。但是我遇到了一个错误。

(defn print-logger
  [writer]
   #(binding [*out* writer]
      (println %)))

(def *out*-logger (print-logger *out*))

(*out*-logger "hello")

将导致:`无法动态绑定非动态var:user / out

我对Clojure很新,并且不明白为什么会发生这种情况,特别是在我关注这个例子时:)

1 个答案:

答案 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