flet + advice で関数定義が壊れる

flet は advice + 関数定義をぶっこわしちゃうんだよな。

# こういうのあるから elisp の cl が嫌い。

1. 普通に関数定義をしてみる。

(defun hoge () 'default)

(hoge)
=> default

2. 関数定義に advice をくっつける。

(defadvice hoge
  (around hoge-ad () activate)
  (setq ad-return-value 'advice))

(hoge)
=> advice

3. flet で一時的に関数定義を上書きして呼び出し。

(require 'cl)
(flet ((hoge () 'flet))
  (hoge))
=> advice

flet してても advice 断片が呼ばれてる。

4. advice 定義を停めてみる。

(ad-disable-advice 'hoge 'around 'hoge-ad)
(ad-activate 'hoge t)

(flet ((hoge () 'flet))
  (hoge))
=> flet

5. あれ?

(hoge)
=> flet

関数の実体は…

(symbol-function 'hoge)
=> (lambda nil (block hoge (quote flet)))

なんか advice の使い方違ってるのかな?
割と advice 使うことあるんで、その内 advice 周りのコード読んでみてもいいかなぁ。