2014/01/09

Lisp再入門

「ANSI Common Lisp(ピアソン・エデュケーション)」と、「On Lisp(オーム社)」を読書中です。いずれもポール・グラハム著です。


学生のころに「プログラムの構造と解釈(Structure and Interpretation of Computer Programs、SICP)」はひと通り読んで、Lisp/Scheme系のひと通りの教養(閉包とか継続とか末尾再帰)は知っているつもりでしたが、Lispの良さ、真髄はそのあたりだけではなくマクロにあるようなので、そこを習得してみようと思ったのでした。

とりあえず、Lisp系は久しぶりなのと基本的にずっとScheme派(Schemeの方がシンプルで良いと思っていたのでした)だったので、リハビリと基礎づくりを兼ねて、ANSI Common Lispの演習をやってみることにしました。

セクション2から真面目に始めてみました。



セクション3は、3-7の最短経路、最長経路を求める問題が面白かったです。
実装は、著者のものと少し違うものにしてみました。

キューの最後にappendするのが遅そうだったのでループ版も書いてみましたが、あまり綺麗になりませんでした。無理やりループ化するのではなくFIFO(リストの先頭と末尾を押さえる)をこしらえて、それで後にエンキューしてやるのが良さそうですね。

3-6の「リストの先頭要素をcdrで、後続要素をcarにする」という問題も面白いですね。最初は題意が取れませんでしたが、(a b c)を(((nil .c) . b) . a)と表現すればよいのだと理解。

0 件のコメント: