Land of Lispを読んだ

長い事積んでたけど最近の週末を使ってようやく読み終えられた。日本語訳の方。
下の変なPV(プログラミングの本のPV!)通りぶっ飛んでて有名なlispの本。

公式ページも漫画になっていて、雰囲気がわかる。
http://landoflisp.com/
いろんなゲームを作って行き、その過程で色々なテクニックを学んで行けるようになっている。最終的には実用的なDSLを作ったりwebサーバを立ててみたり、遅延評価のライブラリを組んだ上にゲームAIを作ったりと盛りだくさん。

ゲームといってもテキストインタフェースのわりと地味なやつが多いのだが、これが結構ちゃんと面白いので作っててうれしいし先へ進むモチベーションが湧く。

後半ではAIとの対戦ができる陣取りゲームも作るのだが、ゲームAIは触れた事がなかったのでとても面白かった。遅延評価を使うとゲーム木という概念をすっきり扱えて、ゲーム木からスコアを計算する事ができればAIのコードがほとんど自明なものになってしまうのね。最初はテキストインタフェースなんだけど最終的にはブラウザ上で操作が完結するグラフィカルなゲームになってうれしかった。

しかしアクセッサみたいなやつを定義しないでリストをそのまま生で扱ったり*1、グローバル(違)変数をわりとカジュアルに使ったり*2、僕がこのへん真似すると簡単にエンバグするかもしれない。BASIC全盛期とかに本に載ってたゲームのコードもこういう感じだったのだろうか。

後半だんだん大変になっていった(特に最後の3章くらい)が示唆に富んだ楽しい本だった。川合さんの訳もよかった。

個人的な雑多なこと

  • 文字列やら配列やらなんでもかんでもlistにするの、効率悪そうに思って今まで半ば生理的に避けていたのだが、早すぎる最適化だったのだろう。リスト処理に特化している言語なのだからなるべくリストの形で扱う事を考えるべきだ。まとも(?)な本読む前に数値計算に使ったりしたせいで変な癖が付いたかも。
  • (readtable-case *readtable*)を:invertにしたときのsymbol-nameの挙動どうかしていると思ってた*3のだけど、多分普通はprincとか使うのだろう。
  • lazyなユーティリティを書いて前のコードをそれで書き直すの割りと非人間的作業感がある。それ以上のリターンはあったけれども。

その他メモ

  • assocは最初に見つかった値だけを取り出すので、alist中の値を書き換えるには単にpushでよい。
  • 最終的に別の場所に出すテキスト出力でもとりあえず標準出力に出すようにしておいて、標準出力の方をファイルやらソケットやらに後でバインドする(デバッグが楽)。
  • グラフ構造を可視化するのにgraphvizが便利。
  • intersection/set-differenceでリストを集合として扱える
  • 関数的に書かれた関数とそうでない関数の区別は意識した方が良さそう
  • マクロのためにまず補助関数を書いて、その後インタフェースの改善としてのマクロを書くというのは良い方法

*1:データをどういう構造にしてるのか思い出さないとコードが追えない

*2:いやそういう関数とそうでない関数は分けてあるのだと思うが

*3:大文字と小文字が混じってる時と混じってない時で挙動が違う