动态var的Clojure绑定不能按预期工作

Dav*_*ail 4 clojure

据我所知,在动态var上设置一个新的绑定会影响该绑定中调用的所有函数,以及从这些函数调用的所有函数.

为什么绑定似乎在下面的第一个例子中丢失了?

(def ^:dynamic *out-dir* "/home/user")

(binding [*out-dir* "/home/dave"] (map #(str *out-dir* %) [1 2 3]))
; gives:    ("/home/user1" "/home/user2" "/home/user3")
; expected: ("/home/dave1" "/home/dave2" "/home/dave3")

(binding [*out-dir* "/home/dave"] (conj (map #(str *out-dir* %) [1 2 3]) *out-dir*))
; gives: ("/home/dave" "/home/dave1" "/home/dave2" "/home/dave3")
Run Code Online (Sandbox Code Playgroud)

Lee*_*Lee 6

这是由map懒惰引起的 - 返回一个在绑定中定义但在外部计算的惰性序列.您需要从内部强制进行评估:

(binding [*out-dir* "/home/dave"] 
  (doall (map #(str *out-dir* %) [1 2 3])))
Run Code Online (Sandbox Code Playgroud)