Есть несколько старых сообщений в блогах, в которых рекомендуется соблюдать осторожность при смешивании динамических переменных, 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
в качестве вывода (используя Clojure 1.4), как и можно было бы наивно ожидать, то есть с изменением формы привязки, наблюдаемой функцией, переданной в pmap. Изменился ли способ взаимодействия локальных привязок потока и pmap? Я нигде не могу найти это задокументировано.