Clojure:绑定与redefs
clojure.core具有宏和。看看clojuredocs.org上的docstring和示例,它们似乎做了一些非常相似的事情。区别是什么?我应该在哪些情况下使用哪一种?Clojure变量可以具有线程本地绑定<代码>绑定使用这些,而带有redefs的Clojure:绑定与redefs,clojure,dynamic-scope,Clojure,Dynamic Scope,clojure.core具有宏和。看看clojuredocs.org上的docstring和示例,它们似乎做了一些非常相似的事情。区别是什么?我应该在哪些情况下使用哪一种?Clojure变量可以具有线程本地绑定绑定使用这些,而带有redefs的实际上改变了var的根绑定(有点像默认值) 另一个区别是绑定仅适用于:动态变量,而带有redefs的则适用于所有变量 示例: user=> (def ^:dynamic *a* 1) #'user/*a* user=> (binding [*a
实际上改变了var的根绑定(有点像默认值)
另一个区别是绑定
仅适用于:动态
变量,而带有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,]>
还可以看到这个问题:这就是为什么带有redefs的用于测试(在测试中,您可能需要插入并删除一个函数),而绑定也可以用于生产代码。@Peeja谢谢,换句话说,带redefs的决不能在多线程上下文中使用?@opqdonut自2019年6月起,Vars文档中有一节突出显示了未来
,发送
,send off
和pmap
具有绑定传送功能-这是否意味着不再需要绑定传送带fn
?@ErikKaplun,绑定传送带fn
如果使用您提到的功能,则不需要。但是,如果您使用(Thread…)
创建线程,您仍然需要它。
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,]>