动态 var 的 Clojure 绑定(bind)未按预期工作

标签 clojure

据我了解,在动态变量上设置新绑定(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/

相关文章:

clojure - 如何在 ClojureScript 中创建按钮元素?

clojure - 在 leiningen eclipse 中找不到 clojure/contrib/duck_streams__init.class 或 clojure/contrib/duck_streams.clj

concurrency - 从队列中消费的 Clojure 代理

performance - 附加到向量的效率

clojure - 前缀::是什么意思

clojure - 需要多个 'sub-namespaces' 和 :as 的快捷方式

clojure - clojure.spec 打算在多大程度上取代传统的功能自动化测试?

Clojure:建模简单的多对多关系

java - 在 Eclipse 中设置 Clojure 代码以进行 REPL 和应用程序部署

clojure - 在Clojure中消除尾部调用?