Clojure: 動的なvar

『プログラミングClojure 第2版』(p.125〜)で、動的なvarに関する記述で、

defやdefnの呼び出しは、メタデータ:dynamicが与えられると動的な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の過去、現在、(とても近い)未来