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)

なんだかいろいろとやってますね