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")))

なぜでしょうか。