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

swe*_*men 1 clojure clojure-java-interop

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

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

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

(*out*-logger "hello")
Run Code Online (Sandbox Code Playgroud)

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

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

Jar*_*314 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
Run Code Online (Sandbox Code Playgroud)

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