每个线程绑定的clojure对我不起作用

时间:2014-05-11 02:47:45

标签: clojure

我正在阅读vars上的clojure页面(此处:http://clojure.org/vars),其中指出当var被标记为动态binding时,线程是本地的:

  

默认情况下,Vars是静态的,但是使用元数据定义的Vars的每线程绑定将它们标记为动态可以通过宏绑定建立,并且在线程内它们遵守堆栈规则

稍后:

  

任何其他线程都无法看到使用绑定创建的绑定。同样,可以为绑定创建绑定,这为嵌套上下文提供了一种在调用堆栈之前与代码进行通信的方法。此功能仅通过设置元数据标签来选择加入:动态为true,如上面的代码块中那样。

所以我决定试试这个:

(def ^:dynamic x 0)
(defn print-x [] (prn x))
(binding [x 100] @(future (print-x)))

我希望看到0打印,因为将来导致操作在新线程中执行,但我得到的结果是10。我还注意到binding文档没有提到线程本地绑定,而有with-bindings函数(或宏)确实讨论了线程本地绑定并且有一个替代(wonky) ,如果你问我)指定绑定的语法,但这并不是我所期望的。

有什么想法吗?我一定错过了一些明显的东西。

1 个答案:

答案 0 :(得分:2)

future函数会自动将其绑定传递给远程线程。 binding-conveyor-fn会发生这种情况,类似于bound-fn,您可以在自己的代码中将其用于同一目的。