2010年1月2日土曜日

【On Lisp】2 関数


** 2 関数
*** 前説
- イメージ指向の簡潔な解説あり。
*** 2.2
- PGは、Lisp2だとコードがかっこ悪くなることがある、
という。正気か?
- 'list'を'lst'と書くのはかっこ悪くないか?
*** 2.4
- お、このタイミングでplistと関数の組み合わせを扱
うのか。展開が早くてよろし。
*** 2.7
- count-instancesでlabelsの必然性の導入というのは
違和感ある。そもそもcount-instancesくらいなら、
labelsというか再帰すら使わないんじゃないかなぁ。

CL-USER> (defun count-instances-1 (obj list-of-lists)
(mapcar #'(lambda (list)
(count-if #'(lambda (x) (eq obj x))
list))
list-of-lists))
COUNT-INSTANCES-1
CL-USER> (count-instances-1 'a '((a b c) (d a r p a) (d a r) (a a)))
(1 2 1 2)
CL-USER>
*** 2.9
- On LispはCLtL2なんだな。
- Allegroは「空でないレキシカル環境においてインタ
プリタ的に定義された関数」をコンパイルできる。

CL-USER> (let ((y 2))
(defun foo (x) (+ x y)))
FOO
CL-USER> (compile 'foo)
FOO
NIL
NIL
CL-USER> (compiled-function-p #'foo)
T
CL-USER>

- そうか。コンパイルされた関数が返す関数はコンパ
イル済みなんだな。

CL-USER> (defun make-adder (n)
#'(lambda (x) (+ x n)))
MAKE-ADDER
CL-USER> (interpreted-function-p #'make-adder)
T
CL-USER> (compiled-function-p #'make-adder)
NIL
CL-USER> (setq add2 (make-adder 2))
#<Interpreted Closure (:INTERNAL MAKE-ADDER) @ #x1000d01fb2>
CL-USER> (interpreted-function-p add2)
T
CL-USER> (compiled-function-p add2)
NIL
CL-USER> (compile 'make-adder)
MAKE-ADDER
NIL
NIL
CL-USER> (interpreted-function-p #'make-adder)
NIL
CL-USER> (compiled-function-p #'make-adder)
T
CL-USER> (setq add2 (make-adder 2))
#<Closure (:INTERNAL MAKE-ADDER 0) @ #x1000e55e52>
CL-USER> (compiled-function-p add2)
T
CL-USER> (interpreted-function-p add2)
NIL
CL-USER>

こつこつ。

0 件のコメント: