ローカル関数 flet と labels

いわゆる、(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