(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

Mastering Clojure Macros を読んだ

読んだ。

On Lisp と LET OVER LAMBDA 読んでたら必要ないかなーとは思うけど、実際の Clojure の著名ライブラリとかで使われているテクニックを本に沿って知ることができるのでそういう意味では良い本かと思います。僕の場合 On Lisp, LOL の内容をあんまりしっかり覚えてなかったので良い復習(?)になりました。

目次はこんな感じ。

Acknowledgments
Introduction
1. Build a Solid Foundation
2. Advance Your Macro Techniques
3. Use Your Powers Wisely
4. Evaluate Code in Context
5. Speed Up Your Systems
6. Build APIs That Say Just What They Mean
7. Bend Control Flow to Your Will
8. Implement New Language Features

1,2 章まではただのマクロの基本なんだけど、 Clojure 特有の「呪い」の話とかあって Clojure 初心者の僕にとっては結構面白い話でした。 3 章以降は上に書いたように著名なライブラリの実装に踏み込んでいきます。僕は本を無視して勝手にコード読みまくって遊んでましたが(笑)。

JS の power-assert なんかは実行する式の AST を取り出して色々とゴニョゴニョするわけだけど、それ相当のことを Clojure は簡単に出来るんだ*1と改めて認識した。昔から Homoiconic という言葉も意味も知っていたけど、改めて理解出来ました。あと個人的に読んでて好きだったのは hiphip の実装でこのマクロの使い方は凄くいいなって思った。やり過ぎは鬱陶しいけど、このくらい綺麗に実装されていると感心するしかない。あと見慣れない単語 "Delimited Continuations" って出てきてなんだろうって思ったら限定継続の話だったりして、割と死んだ*2

ちなみにもしこの本を Clojure に不慣れな人やマクロってまだ良くわからないという人が読むのであれば、マクロ展開を簡単に出来る環境を使いながら読むといいと思います。こうすることでマクロというのが展開されるものだ、という認識をしやすくなると思います。 Emacs/Cider なら C-c C-m で macroexpand-1 相当、 C-c M-m で clojure.walk/macroexpand-all 相当です。

というわけで読んだ本の紹介でした。次は Cookbook かな? or Clojure Programming…

Mastering Clojure Macros: Write Cleaner, Faster, Smarter Code

Mastering Clojure Macros: Write Cleaner, Faster, Smarter Code

*1: Lisp 全般マクロがあれば出来る

*2:あやぴーは継続/限定継続を完全に理解していません