いわゆる、(defun ... の中だけで生きる関数なんだが、
flet と labels のどちらでも定義できる。が、微妙に振る舞いが違う。
flet | let みたいに並列に定義する |
---|---|
labels | let* みたいに直列に定義する |
xyzzy で試してみた。
;; flet の場合
(defun test (a)
(flet ((f1 (x) (+ x 1)) ; f1 と f2 は同時に定義されるので
(f2 (y) (+ (f1 y) 10))) ; f2 を定義する時点で f1 は未定義
(f2 a)))
;; test
(test 5)
関数が定義されていません: f1 ; エラる
;; labels の場合
(defun test (a)
(labels ((f1 (x) (+ x 1)) ; f1 --> f2 の順に定義されるので
(f2 (y) (+ (f1 y) 10))) ; f2 を定義する時点では、すでに f1 が定義済み
(f2 a)))
;; test
(test 5)
16 ; 実行できる
じゃあ、なんで labels は flet* じゃないのか。他に違いがあるんだろうか。なぞだ。
参考URL:
http://d.hatena.ne.jp/Nobuhisa/20090123/1232720807
0 コメント :
コメントを投稿