2011/04/08

ローカル関数 flet と labels



いわゆる、(defun ... の中だけで生きる関数なんだが、


flet と labels のどちらでも定義できる。が、微妙に振る舞いが違う。







fletlet みたいに並列に定義する
labelslet* みたいに直列に定義する

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





Related Posts Plugin for WordPress, Blogger...

0 コメント :

コメントを投稿