マクロをどういうときに使うのか
よくある質問なので、簡単に書いておく。
ある情報源を元に関数を自動生成したい
ドキュメントをパースしてRedisのコマンドを関数化
ある程度マクロ展開時に文字列化している
HTMLに変換したいのに、XMLなども変換されてデッドブランチができる(欠点)
マクロ展開時にHiccupデータをHiccupデータへ変換する
似たような関数を複数作りたい
HTTPレスポンスすべてを返す関数と一部しか返さない関数を作る
スレッディングマクロは分かりやすい例
(defhandler hello [>params>name] (println name))と書けるようになるとか
面倒な処理を隠蔽したい
リソースのクローズ処理を行うためにwith-*マクロ
ビルド時にしか存在しない環境変数(など)を保持しておきたい
Leiningenのproject.cljにあるバージョン番号は開発/ビルド時などにしか参照できない 単純な関数でもできることはあると思うけど、マクロ展開時に処理した方が効率の良いものや、マクロで定型のフローを毎回書かずに済ませたりできるので、使えるなーと思ったら積極的に使ってます。ただ、一般にClojureコミュニティでは「データ > 関数 > マクロ」なので、そのあたりは匙加減を間違えないようにしたい。