Peter Seibel
オーム社
2008-07-26
Common Lisp本、とりあえず片っ端から読んでいこうかと計画してる。
On Lispは、マクロに関する本だったが、これらはもっと色々な応用例を見せてくれる。
Land of Lispは狂った漫画が一番の特色だが(大好き。こういう漫画描きたい)、プログラミング本の特徴としては、古のBasic本みたいに、簡単なゲームを作りながらCommon Lispに入門できる。
しかし、みんなちゃんと遊べるから偉い。
graphvisを出力にして、超簡易GUIを作るとか、面白いアイディアだと思う。
clispの拡張機能を作るとはいえ、自分でwebサーバーを作っちゃうのも面白い。
ただし、書いてあるコードだとchromeではエラーが出て、firefoxだと単なるテキストになってしまった。なので、簡単なhttpのヘッダーを頭につけてやるとちゃんと動いだ。
この本もOn Lispと一緒で、最終目標はマクロでDSLを作ること。それこそがやはりLispの魂。
この本ではSVGを生成するDSLを作って、それをwebブラウザで表示してゲームを作ってる。
しかし感動したのは、簡単なマクロを使って遅延評価を取り入れ、非常にエレガントにゲームのアルゴリズムを作ってること。
ゲームの木を全て表現するデータ構造を使って、あとは遅延評価を取り入れれば、出来上がり。
もちろんより良いレスポンスを求めたければ木の無駄な枝を刈り取る必要がある。
予想以上に伝統的なAIプログラミングだ。
On Lispには書いてないようなformatやloopの話が載ってるのも面白い。ポール・グレアムはloop嫌いだしね。
loopとformatの黒魔術をガンガン使ったショートコードゲームはめまいがする。
ただし、書いてないことも多い。CLOSについてはコミックに書いてあるだけ。packageには触れもしない。マクロについても最後に重要な役割を果たすけど、ちゃんと書いてあるとは言い難い。
『実践Common Lisp』も実践の名に恥じぬ本。
特にバイナリを色々いじるのが面白かった。他のプログラミング言語の本でも滅多にバイナリを直接いじることはない。
この本ではmp3ファイルのメタデータを取得して、SQLライクなデータベースを自作してる。面白い。
あとWebプログラミングもできる。その際、htmlを吐き出すテンプレート言語を自作する。面白い。
やはりこの本も目標はマクロを使って、バイナリデータを表現するクラス階層表現言語やデータベースへのクエリ言語やhtml生成言語などのDSLを作ること。ここにもLispの魂。
この本もloopとformatについては詳しく書いてある。
さらにpackageについてや、eval-whenなどの高度な機能についても説明してある。
実際に製品を作ろうとすれば必要になる知識だろう(しかし、まだ外部のパッケージ管理等、現代的なエコシステムには必要なものが欠けているが、これはここ数年で進歩した部分なので、書いてないのは当たり前だ)。
しかし、欠点としては、高度が全く関数型的ではないことだ。何でもかんでもとにかくloopで書こうとする。そもそも再帰に関する説明が全くない。
次は『実用Common Lisp』を読むぞ