fletとcl-fletの差異
Emacs Lisp で (require 'cl) を避けるために、等価な代替として cl-lib を使ってコードを書いたところ、予想に反する結果を得ました。
(defun foo () (get-buffer "hoge"))
(cl-flet ((get-buffer (buf-or-name)
(car-safe (member buf-or-name '("hoge" "fuga")))))
(or (get-buffer "hoge") (error "A"))
(or (foo) (error "B")))
エラーなしに "hoge" が返ることを期待しましたが、実際には (error "B") に到達しました。 (error "A")ではないので、最初の (get-buffer) は期待通りに動作してるようです。
cl-libではなく、clパッケージのfletを利用すれば問題はありませんでした。
(require 'cl)
(defun foo () (get-buffer "hoge"))
(flet ((get-buffer (buf-or-name)
(car-safe (member buf-or-name '("hoge" "fuga")))))
(or (get-buffer "hoge") (error "A"))
(or (foo) (error "B")))
なぜでしょうか。