1

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

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

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

(*out*-logger "hello")

会导致:`Can't dynamic bind non-dynamic var: user/ out

我对 Clojure 很陌生,不明白为什么会发生这种情况,尤其是当我按照示例进行操作时:)

4

1 回答 1

5

问题不在您拥有的代码示例中。

*out*应该参考clojure.core/*out*,所以如果你在 repl 中运行它,你可能已经运行了以前的东西,你所拥有的,比如(def *out* something)创建一个user/*out*.

然后,当您定义print-logger函数时,该(binding [*out* writer] ...)语句将尝试重新绑定user/*out*而不是clojure.core/*out*.


您可以使用从您的命名空间ns-unmap中删除。user/*out*

(ns-unmap 'user '*out*) ;; => nil

您还需要print-logger再次定义您的函数以重新获取正确的clojure.core/*out*.

于 2013-11-02T17:07:03.497 回答