【发布时间】:2015-12-19 22:40:29
【问题描述】:
我正在尝试重现 Chas - http://cemerick.com/2009/11/03/be-mindful-of-clojures-binding/ 描述的动态变量的缺陷。
考虑以下 sn-p:
(def ^:dynamic *dynamic-x* 10)
(defn adder [arg]
(+ *dynamic-x* arg))
(adder 5) ;; returns 15
(binding [*dynamic-x* 20]
(adder 5)) ;; returns 25
(binding [*dynamic-x* 20]
@(future (adder 5))) ;; returns 25 (!)
实际上,我预计第三种情况将返回 15,只要在单独的线程上执行添加并且应该使用 *dynamic-x*(我应该是 10)的当前线程本地值。但是,出乎我意料的是,它返回 25。
我哪里错了?
【问题讨论】:
-
您能否为该问题提供一个更好的标题?也许像
why does a dynamic binding unexpectedly work with a future -
@cfrick 是的,当然。实际上是在考虑这个:)
标签: clojure future dynamic-variables