defmacro!

土曜になつたんさんとあろはさんとお会いして、飲んできました。
お二人とも楽しい話をありがとうございました。
今、なつたんさんにお借りしたLet Over Lambdaを読んでいるのですが、
噂どおり非常に濃い内容でした。
最初の方に登場するマクロでさえ恐ろしい。
Paul GrahamがOn Lispで書いたマクロnifが

(defmacro nif expr pos zero neg)
(let ((g (gensym))
`(let ((,g ,expr))
(cond ((plusp ,g) ,pos)
((zerop ,g) ,zero)
(t,neg)))))

Let Over LambdaのDoug hoyteの手によって、

(defmacro/g! nif (expr pos zero neg)
`(let ((,g!result ,expor))
(cond ((plusp ,g!result) ,pos)
((zerop ,g!result) ,zero)
(t ,neg))))

物凄い勢いで改造されていく。

(defmacro! nif (o!expr pos zero neg)
`(cond ((plusp ,g!expr) ,pos)
((zero ,g!expr) ,zero)
(t ,neg)))

なんてこった。
ネストがどんどん浅くなっていって、
どんどん訳が分からなくなっていく。
defmacro!はwith-gensymsとonly-onceを隠蔽したようなマクロで、
慣れたらかなり便利そうです。
(with-gensymsとonly-onceについてはそれぞれ”On Lisp“と”実践Common Lisp“を参照してください(笑))
この辺りはWebで無料で読めるので、
defmacro/g!やdefmacro!の定義が気になる方はこちらをどうぞ。

Leave a Reply