据我了解,在动态变量上设置新绑定(bind)会影响该绑定(bind)内调用的所有函数以及从这些函数调用的所有函数。
为什么在下面的第一个示例中绑定(bind)似乎丢失了?
(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")
最佳答案
这是由惰性引起的 - map
返回一个惰性序列,该序列在绑定(bind)内部定义,但在外部求值。您需要从内部强制评估:
(binding [*out-dir* "/home/dave"]
(doall (map #(str *out-dir* %) [1 2 3])))
关于动态 var 的 Clojure 绑定(bind)未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33500282/