LET OVER LAMBDA を読んだ
通称「 LOL 」読み終わりました。完全に宗教の本でした。
もちろん、僕はまだ On Lisp を読んでいないし、まして Common Lisp を知らないので深く理解出来たわけではないのですが、 Common Lisp の実用性の高さとマクロの真髄を垣間見れた気がします*1。
簡単に紹介するなら Lisp on Forth on Lisp を書く本です(違
目次はこんな感じ。
第1章 クロージャ
第2章 マクロの基礎
第3章 リードマクロ
第4章 プログラムするプログラム
第5章 アナフォリックマクロ
第6章 マクロの効率
第7章 Lispを動かすForthを動かすLisp
付録
僕が一番感動したのはアナフォリックマクロの章で、まぁそもそも On Lisp を読めばいいんですけどまだ読んでいなかったので「こんなことが出来るのかー」っていう感動は一番大きかったです。
すっごいわざとらしい例を書くけど、こういうこと出来るのかーって気持ちになった。
(defmacro aif (test then &optional else) `(let ((it, test)) (if it ,then ,else))) (defmacro alambda (parms &body body) `(labels ((self ,parms ,@body)) #'self)) (aif (funcall (alambda (n) (if (zerop n) 0 (+ n (self (- n 1))))) 10) (format nil "result: ~A" it))
少し前にマクロすげーって思ったときはただただ構文を自分で定義出来るという点が素晴らしいのだと思っていた。
だけど、実際にはマクロはそれ以上のものを Lisp プログラマにもたらしてくれることがわかった。リードマクロ、アナフォリックマクロ、コンパイラーマクロ、などなど、それぞれがそれぞれに面白いところがあり副作用すらをも自分が自由に使えるものとして扱おうとするのが凄い。
この本自体に対する感想としては、本当に作者が Paul Graham と Common Lisp の信者過ぎてやばいっていうのがひとつと、最後の付録で Emacs 使いを dis りにきたのが最高に面白かった。
とりあえず、興味が完全に Common Lisp とマクロに向いてしまったので、今年の残りは Common Lisp にあてようかなーとか血迷ったことを考えている。