clojure.core 具有宏绑定和with-redefs。查看 clojuredocs.org 上的文档字符串和示例,它们似乎做了非常相似的事情。有什么区别,我应该在哪些情况下使用哪一个?
3414 次
1 回答
34
Clojure Vars 可以具有线程本地绑定。binding
使用这些,而with-redefs
实际上改变了 var 的根绑定(类似于默认值)。
另一个区别是binding
仅适用于:dynamic
vars 而with-redefs
适用于所有 vars。
例子:
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-conveyor-fn
将线程本地绑定传递到新线程中:
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,]>
于 2013-11-22T07:41:04.410 回答