いわゆる、(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* じゃないのか。他に違いがあるんだろうか。なぞだ。