On Lisp - Advanced Techniques for Common Lisp

Paul Graham

1993年に書かれた名著(らしい)が2007年になってなぜか邦訳されている.後書きを読むと,絶版になってWeb上に公開されていたものを東大の物工の学生さんが翻訳してWeb上に公開,それが出版された,という経緯らしい.

内容は,Common Lispのマクロに重点を置き,ClosureとMacroをつかって Continuationを実装したり,Prologを埋め込み言語として (つまりPrologの定義式がMacroでLispプログラムに展開されるように) 実装したり,CLOSのスケルトンを書いたりと,盛りだくさん.ちゃんと手を動かしながら読めば,相当楽しめそうだ.

Lisp のMacroは,非常に強力な機能であるにも関わらず,その後の言語ではほとんど採用されていない.一部のコンパイルタイムメタを目指した研究言語(Open C++とか Open Javaとか)で実験的に用いられているが,成功したとは言いにくい.これはMacroがプログラムをデータ構造として生成しなければならないため,Lispのようにもともとプログラムとそれが扱うデータ構造が同じ言語でないと成立しにくいということなのだろう.その分,Lispのプログラムはすさまじく読みにくかったりするわけだが,そのおかげでMacroがつかえると思えば腹も立たないというところか.

もう少し書きやすい言語で,しかもMacroが比較的容易に利用できる言語を設計できないものだろうか.JSONあたりをベースにしてプログラムのシンタックスを設計すれば,Lispよりは読みやすくできそうだけど.

Macroの特徴的な応用のひとつに,DSL(Domain Specific Language) がある.Macroで言語を拡張することで,特定の目的の表現にフィットした言語にするわけだ.この本で紹介されているPrologなんかもDSLであるといえる. DSLには最近ではRubyを使うのがはやりだと聞くが,どういう風に実装しているんだろう?YAMLで書かせて,Rubyの関数やClosureに動的に変換しているんだろうか?であれば,Macroとあまりかわらないと考えることができるかもしれない.