Land of Lispを読んだ
長い事積んでたけど最近の週末を使ってようやく読み終えられた。日本語訳の方。
下の変なPV(プログラミングの本のPV!)通りぶっ飛んでて有名なlispの本。
公式ページも漫画になっていて、雰囲気がわかる。
http://landoflisp.com/
いろんなゲームを作って行き、その過程で色々なテクニックを学んで行けるようになっている。最終的には実用的なDSLを作ったりwebサーバを立ててみたり、遅延評価のライブラリを組んだ上にゲームAIを作ったりと盛りだくさん。
ゲームといってもテキストインタフェースのわりと地味なやつが多いのだが、これが結構ちゃんと面白いので作っててうれしいし先へ進むモチベーションが湧く。
後半ではAIとの対戦ができる陣取りゲームも作るのだが、ゲームAIは触れた事がなかったのでとても面白かった。遅延評価を使うとゲーム木という概念をすっきり扱えて、ゲーム木からスコアを計算する事ができればAIのコードがほとんど自明なものになってしまうのね。最初はテキストインタフェースなんだけど最終的にはブラウザ上で操作が完結するグラフィカルなゲームになってうれしかった。
しかしアクセッサみたいなやつを定義しないでリストをそのまま生で扱ったり*1、グローバル(違)変数をわりとカジュアルに使ったり*2、僕がこのへん真似すると簡単にエンバグするかもしれない。BASIC全盛期とかに本に載ってたゲームのコードもこういう感じだったのだろうか。
後半だんだん大変になっていった(特に最後の3章くらい)が示唆に富んだ楽しい本だった。川合さんの訳もよかった。
個人的な雑多なこと
- 文字列やら配列やらなんでもかんでもlistにするの、効率悪そうに思って今まで半ば生理的に避けていたのだが、早すぎる最適化だったのだろう。リスト処理に特化している言語なのだからなるべくリストの形で扱う事を考えるべきだ。まとも(?)な本読む前に数値計算に使ったりしたせいで変な癖が付いたかも。
- 読んでる間ずっと http://www.clisp.org が落ちていて(というかbandwidth limitを超えたため遮断となっていて)なんだこれとなった。 http://www.gnu.org/software/clisp/ は繋がることに最後の方で気付いた。
- (readtable-case *readtable*)を:invertにしたときのsymbol-nameの挙動どうかしていると思ってた*3のだけど、多分普通はprincとか使うのだろう。
- lazyなユーティリティを書いて前のコードをそれで書き直すの割りと非人間的作業感がある。それ以上のリターンはあったけれども。