gpt4 book ai didi

Clojure:绑定(bind)与 with-redefs

转载 作者:行者123 更新时间:2023-12-03 01:29:01 26 4
gpt4 key购买 nike

clojure.core 有宏 bindingswith-redefs 。查看 clojuredocs.org 上的文档字符串和示例,它们似乎做了非常相似的事情。有什么区别以及在什么情况下应该使用哪一种?

最佳答案

Clojure 变量可以具有线程本地绑定(bind)。 binding 使用这些,而 with-redefs 实际上改变了 var 的根绑定(bind)(类似于默认值)。

另一个区别是 binding 仅适用于 :dynamic 变量,而 with-redefs 适用于所有变量。

示例:

user=> (def ^:dynamic *a* 1)
#'user/*a*
user=> (binding [*a* 2] *a*)
2
user=> (with-redefs [*a* 2] *a*)
2
user=> (binding [*a* 2] (doto (Thread. (fn [] (println "*a* is " *a*))) (.start) (.join)))
*a* is 1
#<Thread Thread[Thread-2,5,]>
user=> (with-redefs [*a* 2] (doto (Thread. (fn [] (println "*a* is " *a*))) (.start) (.join)))
*a* is 2
#<Thread Thread[Thread-3,5,]>

您可以使用(未​​记录的)binding-传送器-fn 将线程本地绑定(bind)传送到新线程中:

user=> (binding [*a* 2] (doto (Thread. (#'clojure.core/binding-conveyor-fn (fn [] (println "*a* is " *a*)))) (.start) (.join)))
*a* is 2
#<Thread Thread[Thread-5,5,]>

关于Clojure:绑定(bind)与 with-redefs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20139463/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com