暂时覆盖 Emacs Lisp 中的函数

问题描述 投票:0回答:1

我想重写一个函数,但仅限于从另一个特定函数调用它时。根据这个问题的答案,我写了以下内容:

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

那么我做错了什么,有没有办法让它发挥作用?

emacs elisp
1个回答
0
投票

在发布后找到了部分解决方案:使用

flet
包中的
cl.el
而不是
cl-flet
有效:

(require 'cl)

(defun zzz/wrapper (f &rest r)
  (flet
      ((zzz/original
        ()
        (message "Replacement func")))
    (apply f r)))

然而,这会触发有关

cl.el
的弃用警告,因此我仍在寻找未弃用的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.