clojure初心者です。
非常に初歩的な質問ですみませんが、clojureといえども、varに対する再束縛は問題なくできると考えてよいのでしょうか?

user => (def a 100)
user => a
; 100と表示
user => (def a 200)
user => a
; 200と表示

clojureが変数(varのこと)の参照先オブジェクトを変更できないイミュータブルな性質を持つことはjava等の経験から理解できます。

その一方で、関数型言語では「再代入」はできない、なんていう言葉も何度もそれとなく聞いておりまして、それはなんとなくそういうものなのかと思っていました。それゆえ、本日思わぬ形で上記の例に出会ってしまい、今までも似たようなものは見てたのでしょうが、はたと気がついて混乱しております。

私の拙い理解では、これだと再代入は「できている」、clojure流の言葉では「再束縛」が起きているとでも言えばいいのでしょうか、とにかく同じvarに別の値を結びつけることができています。

user=> (defn xyz []                               
         (let [abc 100]                    
              (let [abc 200] (+ abc 100))))
user=> (xyz)
300

let を使っても同じことです。

変数の値の再代入は他の言語でも普通にありますし、この動作がおかしいなどと言うつもりは毛頭ないのですが、いわゆる「関数型言語に再代入はない」的な言説が何を言わんとしているのかがわからなくなりました。再代入ができないのではなく、再代入を避けやすい、という意味で使われることが多いのでしょうか。

「プログラミングclojure」という本を読みながら学習しているのですが、このことについては特に記述がないか、見つけられません。なので、しょーもない質問とは思いますが、おかしな理解をするのも良くないので、どなたか教えてくださると嬉しいです。