On Lisp 読書中

On Lisp 邦訳 が Web 上で公開されていたので読んでみた。

On Lisp は ハッカーと画家 などの名著で有名な Paul Graham 氏の Lisp 本。ハッカーと画家 の中で Lisp が絶賛されていたので前から気になっていた。

いちおう Lisp 経験者のための本なんだけど、初心者向けの変な説明がなくて、初心者な自分にもわかりやすかった。Lisp 自体の経験はないんだけど、Lisp の影響を大きく受けたとされる Ruby や JavaScript の知識はあるので、いまのところ置き換えながら読めてますよ。

いきなり、関数、λ(無名関数)、高階関数(関数を引数)から説明しだすところがとても好感が持てる。

On Lisp

On Lisp

ハッカーと画家 コンピュータ時代の創造者たち

ハッカーと画家 コンピュータ時代の創造者たち

以下、読書メモ

2. 関数

いきなり、defun と lambda の違い(分かりやすすぎる!)

.defunlambda
定義(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) と同じかな。

具体例がどんどん出てくる。コードを読む前に自分で考えてみるが難しい。

飛ばし気味に読み進める。