2009年01月27日
On Lisp 読書中
On Lisp 邦訳 が Web 上で公開されていたので読んでみた。
- http://user.ecc.u-tokyo.ac.jp/~tt076524/onlispjhtml/
- PDF版: http://user.ecc.u-tokyo.ac.jp/~tt076524/onlisp_j.pdf
On Lisp は ハッカーと画家 などの名著で有名な Paul Graham 氏の Lisp 本。ハッカーと画家 の中で Lisp が絶賛されていたので前から気になっていた。
いちおう Lisp 経験者のための本なんだけど、初心者向けの変な説明がなくて、初心者な自分にもわかりやすかった。Lisp 自体の経験はないんだけど、Lisp の影響を大きく受けたとされる Ruby や JavaScript の知識はあるので、いまのところ置き換えながら読めてますよ。
いきなり、関数、λ(無名関数)、高階関数(関数を引数)から説明しだすところがとても好感が持てる。
- 作者: ポール グレアム
- 出版社/メーカー: オーム社
- 発売日: 2007-03
- メディア: 単行本
- Amazon のレビューを見る
- 作者: ポール グレアム
- 出版社/メーカー: オーム社
- 発売日: 2005-01
- メディア: 単行本
- Amazon のレビューを見る
以下、読書メモ
2. 関数
いきなり、defun と lambda の違い(分かりやすすぎる!)
. | defun | lambda |
---|---|---|
定義 | (defun x (引数) ...) | (lambda (引数) ...) |
実行するには | (x 渡す引数) | ((lambda (引数) ...) 渡す引数) |
実体を取り出す | #'x | #'(lambda (引数) ...) |
シンボル | 'x | なし |
apply, funcall
- JavaScript の知識があれば違和感ない
属性で OOP
- メソッドはオブジェクトのプロパティが関数であるにすぎない
レキシカルスコープ と ダイナミックスコープ
- レキシカルスコープ
- Common Lisp はこれ
- JavaScript もこれ
- ダイナミックスコープ
- スタックをたどる
末尾最適への書き方
3. 関数的プログラミング
reverse を定義
- オレオレ reverse を書いてみた。
(defun myreverse (lst &optional acc) (if (null lst) acc (myreverse (cdr lst) (cons (car lst) acc))))
非破壊的にしましょう
- 破壊的なもの set setq setf psetf psetq incf decf push pop pushnew rplaca rplacd rotatef shiftf remf remprop remhash let* は意識して使う
- クォート付きオブジェクトを直接返すと、呼出後に返り値に破壊的な操作をされる可能性がある
- 副作用を隔離するとすっきりするよ
多値
- values で返す
- mapliple-value-bind で受け取る
4. ユーティリティ関数
本題とは関係ないけど '(a b)
は (list 'a 'b)
と同じかな。
具体例がどんどん出てくる。コードを読む前に自分で考えてみるが難しい。
飛ばし気味に読み進める。