我尝试理解动态变量和绑定函数,因此我尝试了这个(Clojure 1.3):
user=> (defn f []
(def ^:dynamic x 5)
(defn g [] (println x))
(defn h [] (binding [x 3] (g)))
(h))
#'user/f
user=> (f)
5
nil
有点困惑,我尝试了这段相对简单的代码:
user=> (def ^:dynamic y 5)
#'user/y
user=> (defn g [] (println y))
#'user/g
user=> (defn h [] (binding [y 3] (g)))
#'user/h
user=> (h)
3
nil
这两段代码有什么区别?为什么第二个示例可以工作,而第一个则不行?提示:我刚意识到以下代码可以工作(但还不完全明白原因):
user=> (def ^:dynamic y 5)
#'user/y
user=> (defn f [] (defn g [] (println y)) (defn h [] (binding [y 3] (g))) (h))
#'user/f
user=> (f)
3
nil
user=>
^:dynamic
在1.3版本之前还不是语言的一部分 - 所以不,这并不是一个错误,只是尚不存在的东西;在那个时候,动态变量被命名为*barbells*
,这不仅仅是一种约定。 - Charles Duffy