有几篇有些旧的博客文章建议在混合动态变量时要小心binding
, 和pmap
,例如在这里,我们得到以下代码片段:
user=> (def *foo* 5)
#'user/*foo*
user=> (defn adder
[param]
(+ *foo* param))
#'user/adder
user=> (binding [*foo* 10]
(doseq [v (pmap adder (repeat 3 5))]
(println v)))
10
10
10
nil
但这不是我运行该代码时发生的情况(将第一行更改为(def ^:dynamic *foo* 5)
)。我得到了三个15
s 作为输出(使用 Clojure 1.4),正如您天真地期望的那样——也就是说,传递给 pmap 的函数看到的绑定形式的变化。线程本地绑定和 pmap 交互的方式是否发生了变化?我在任何地方都找不到这个记录。