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")))
なぜでしょうか。