『プログラミングClojure 第2版』(p.125〜)で、動的なvarに関する記述で、
というのがありますが、少しばかり解りにくいというか、その後の記述で推測するしかないですね。
これは、「通常のvarは、ダイナミックスコープで束縛することはできないが、メタデータ:dynamicを付加すると、bindingを使用したダイナミックスコープでの束縛を利用することができる」ということのようです。
試してみます。
user=> (def ^:dynamic foo 10) #'user/foo user=> (def bar 10) #'user/bar user=> (defn print-foo [] (println foo)) #'user/print-foo user=> (defn print-bar [] (println bar)) #'user/print-bar user=> (binding [foo 42] (print-foo)) 42 nil user=> (binding [bar 99] (print-bar)) IllegalStateException Can't dynamically bind non-dynamic var: user/bar clojure.lang.Var.pushThreadBindings (Var.java:320)
こちらに素晴らしい説明があります。
1.3, 1.4, 1.5: Clojureの過去、現在、(とても近い)未来