On Lisp(4)
- 第5章 返り値としての関数
- 関数に関数を渡す事(高階関数)で可能になるいろいろな例やテクニック
- 第6章 表現としての関数
- 柔軟なソフトを作る為にデータとそれを解釈して動くプログラム(関数)を書きますが、クロージャを使うとデータを関数内に保存してしまい、データ無しで同様なソフトが作れます。クロージャの強力さを実感できる例題でした。
- 第7章 マクロ *途中まで*
- Lispのマクロは超強力! macroexpand-1 を使ってdefunマクロの展開結果を見てみた(処理系はclisp)
> (pprint (macroexpand-1 '(defun my-car(x) (car x)))) (LET NIL (SYSTEM::REMOVE-OLD-DEFINITIONS 'MY-CAR) (SYSTEM::EVAL-WHEN-COMPILE (SYSTEM::C-DEFUN 'MY-CAR (SYSTEM::LAMBDA-LIST-TO-SIGNATURE '(X)))) (SYSTEM::%PUTD 'MY-CAR (FUNCTION MY-CAR (LAMBDA (X) (DECLARE (SYSTEM::IN-DEFUN MY-CAR)) (BLOCK MY-CAR (CAR X))))) (EVAL-WHEN (EVAL) (SYSTEM::%PUT 'MY-CAR 'SYSTEM::DEFINITION (CONS '(DEFUN MY-CAR (X) (CAR X)) (THE-ENVIRONMENT)))) 'MY-CAR)
なんだかいろいろとやってますね ☺