昨日(2008/04/23)、GREE勉強会に出席しました。Mew開発者の山本さんによるLispトークを聞くことができました。「
GREEオープンソーステクノロジー勉強会」のサイトから、概要を引用します。
Lisperの僕にはそんな自覚はなかったのですが、Lispに憧れているプログラマもいらっしゃるようです。この講演では、Lispの基本データ型であるセルがなぜ一対のポインタなのか、そしてマクロを使ってどうLispを成長させていけるのかを説明することで、Lispプログラミングの雰囲気を伝えたいと思います。
ということで、
にわかSchemerな僕は一も二もなく、この勉強会に飛びつくことにしました。以下は勉強会のレポートです。概ね、
資料の通りにお話されていたので、併せて参照してもらえればと思います。また、記憶違いなどがあるかもしれないので、その際はご指摘お願いします。
なお、他の参加者のブログは
こちらから参照できます。
--
1. Lispことはじめ
- 黒澤明監督はアカデミー賞の授賞式で、「僕はまだ映画がわからない」と言っていた
- 一方で、私はまだLispがわからない
- Lispの求人数はJavaの求人数の0.2%しかない
- IIJは和田さんと私で、二人もLisperがいる珍しい組織
- SchemeとHaskellとCのポインタがわかれば、Java歴5年の人に2日で追いつける
- 『Little Schemer』と『プログラミングGauche』を読めば、たいていは事足りる

『The Little Schemer』

『プログラミングGauche』
- Lispを学べば括弧は見えなくなる
- Lispを学べばインデントしか見えなくなる
- 括弧やインデントはエディタに任せる
2. セルはどうして2つのポインタなのか?
(print (cons 1 (cons 2 (cons 3 '())))) #=> (1 2 3)(print '(1 . (2 . (3 . ())))) #=> (1 2 3)(print '(1 2 3)) #=> (1 2 3)
- 上記の式は全て同じ結果を返す
- (だけど) これが入れ子構造になっているのを理解することが重要
- 入れ子構造になっているのを理解すれば再帰で処理しようと思える
(define member? (lambda (a l) (cond ((null? l) #f) ((eq? (car l) a) #t) (else (member? a (cdr l))))))(print (member? 2 '(1 2 3))) #=> #t(print (member? 4 '(1 2 3))) #=> #f
- 上記の式は再帰の例
(print (assoc "foo" '(("boo" "ワラの家") ("foo" "木の家") ("woo" "レンガの家"))))
- 二分木も簡単に表現できる
- 逆ポーランド記法も簡単に書ける(資料にコードが記述されています)
- 本質と効率をわけて考える
- Schemeには本質的に必要な物しかない
- 効率は問題になるまで考えない方がよい (from 『珠玉のプログラミング』)

『珠玉のプログラミング―本質を見抜いたア...』
3. Lispのマクロはどんな風に使うのか?
- 関数は小さく
- 副作用のある関数とない関数を分ける
- 再帰する(高階関数を使う)
- マクロを書く
- Cのマクロは嫌われもの、Lispのマクロはヒーロー
- 直交的なプログラミング(少数のオペレータを組み合わせて多様な意味を表現する)
- DRY(Don't Repeat Yourself)
(資料ではFizzBuzz問題を例にして、それを解くためにマクロで機能拡張をしていく様子が記述されています)
4. データと関数の区別がないとはどういうことか?
- Lispのインタプリタを書けば理解できる
(正直なところ、この辺りから僕(=mahata)の理解が曖昧です)
(ひたすらLispのevalを実装していきました)
- 『LISP 1.5 Programmer's Manual』はLisperなら一度は読むことになる本
- Lispには5つの関数(car,cdr,cons,eq,atom)と2つの特殊形式(quote,cond)しかない

『Lisp 1.5 Programmer's Manual』
(後は資料を確認してください : 説明できるほど理解できていない...)
5. 感想
Lisperから話を聞く機会など滅多にないので、今回の勉強会は、テーマ発表時からかなり楽しみにしていました。その期待は裏切られず、充実した時間を過ごすことができました。その一方で、資料に対して発表時間がやや短いように思えました。発表の後半はやや加速度がついてしまい、理解が浅くなってしまったように思えます(僕の事前知識が足りない、というのもある)。
もう少し、Lispの勉強をした後で、改めてお話を伺えればいいなあ。そんな機会に恵まれるかわからないけど。