每当我将for
宏与动态变量和binding
混淆时,我就会发现这种奇怪的行为。为了说明这一点,我提出了这个最小的例子,我可以在我在系统中调用的任何lein repl
中运行:
(def ^:dynamic foo 1)
(binding [foo 2]
(println foo)) ; => 2
(binding [foo 2]
(for [x (range 1)]
(println foo))) ; => 1
如您所见,当在for
范围内时,动态变量foo
的值将丢失并获得原始值。我应该将此报告为错误吗?或者是否有行为的解释?