refactoring
自作の Lisp インタプリタのリファクタリング中。ちゃんとやっておかないとコンパイラにするときに苦労しそうなので。
- 関数の中に一つの式しか許さない作りになっていたことに気づく。defun で定義する関数の body は、暗黙的な progn に囲まれている、と思うべき。修正ついでに スペシャルオペレーター progn も導入。
- ついでにラムダ式を導入。あれ、難しいと思ってたけどそうでもなかった。関数の評価とまるで同じ。
いまさらだが、 Lisp の関数は行指向ではなく、式の固まりとして読む。例えば、関数 fib を以下のように定義したとき、
(defun fib (n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2)))))
4行の定義と思うのは間違い。要素4(4つ目は入れ子のリスト)の式と見るのが正しい。
N | 中身 |
1 | defun |
2 | fib |
3 | (n) |
4 以降 | ( (if ...)) |
関数定義も単なる式。