(gensym) はユニークになるのに、 `(symb#) はユニークにならないのは何故?
初見だと僕も見事に引っかかった。
(defmacro indirection [name & body] `(do (def name# ~@body) (defn ~name [] name#)))
このマクロは一度しか展開されないので、実行する度にいちいち展開されて name# に違う名前がつくと思うのは間違っているよという話。
まぁこういう書き方がそもそもイケてないので、 let や fn を使ってローカル変数を作ろうよと最後に行き着くわけですね。
(defmacro indirection [name & body] `(let [name# ~@body] (defn ~name [] name#)))