我想重写一个函数,但仅限于从另一个特定函数调用它时。根据这个问题的答案,我写了以下内容:
(defun zzz/original () (message "Original func"))
(defun zzz/uses-original () (zzz/original))
(defun zzz/wrapper (f &rest r)
(cl-flet
((zzz/original
()
(message "Replacement func")))
(apply f r)))
(advice-add #'zzz/uses-original
:around
#'zzz/wrapper)
我期望调用
(zzz/original)
会继续打印 "Original func"
(确实如此),并且调用 (zzz/uses-original)
会打印 "Replacement func"
(它不会:它仍然打印 "Original func"
)。
请注意,如果我内联
zzz/uses-original
的内容而不是通过 apply
调用它,那么我会得到预期的结果:
(defun zzz/wrapper (f &rest r)
(cl-flet
((zzz/original
()
(message "Replacement func")))
;; Following is a copy of the code from `zzz/uses-original':
(zzz/original)))
那么我做错了什么,有没有办法让它发挥作用?
在发布后找到了部分解决方案:使用
flet
包中的 cl.el
而不是 cl-flet
有效:
(require 'cl)
(defun zzz/wrapper (f &rest r)
(flet
((zzz/original
()
(message "Replacement func")))
(apply f r)))
然而,这会触发有关
cl.el
的弃用警告,因此我仍在寻找未弃用的解决方案。