由于不匹配的递归(在循环体和循环参数中具有不同推断类型的循环局部变量)导致循环体需要重新分析,循环体内的宏展开可能会发生多次,导致在宏展开过程中产生的任何副作用可能被评估多次。
`
Clojure 1.7.0-master-SNAPSHOT
user=> (defmacro x [] (println "foo"))
'user/x
user=> (fn [] (loop [y 1] (x) (recur (Integer. 1))))
foo
foo
<user$eval6$fn7 user$eval6$fn7@71687585>
`