Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure:绑定与redefs_Clojure_Dynamic Scope - Fatal编程技术网

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

clojure.core具有宏和。看看clojuredocs.org上的docstring和示例,它们似乎做了一些非常相似的事情。区别是什么?我应该在哪些情况下使用哪一种?

Clojure变量可以具有线程本地绑定<代码>绑定使用这些,而带有redefs的
实际上改变了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,]>