Emacs 保存原始函数,用flet在本地重新绑定,并从新函数内部调用原始函数?

Emacs 保存原始函数,用flet在本地重新绑定,并从新函数内部调用原始函数?,emacs,elisp,Emacs,Elisp,主语。 比如: (lexical-let (oldf #'original-func) (flet ((original-func (arg) do-something (funcall oldf arg))) do-something)) 不工作:(希望这能帮助您理解语法,调用swap函数调用foo1,但执行foo2 您可以使用replace函数将其编写为一个有用的宏,该函数在执行传入的主体时将旧函数与新函数绑定 (de

主语。 比如:

(lexical-let (oldf #'original-func)
   (flet ((original-func (arg)
             do-something
             (funcall oldf arg))) 
      do-something))

不工作:(

希望这能帮助您理解语法,调用swap函数调用foo1,但执行foo2

您可以使用replace函数将其编写为一个有用的宏,该函数在执行传入的主体时将旧函数与新函数绑定

(defun foo1()
  (insert "hi foo1"))

(defun foo2()
  (insert "hi foo2"))

(defun swap-function(old new)
  (let ((save-func (symbol-function old)))
    (fset old (symbol-function new))
    (funcall old)
    (fset old save-func)))

(swap-function #'foo1 #'foo2)

emacs lisp中没有读取器宏,您需要使用
符号函数
明确

(defun test-1 (x)
  (message "base test %s" x))

(let ((old-test-1 (symbol-function 'test-1))
      (z 10))
  (flet ((test-1 (y)
           (funcall old-test-1 y)
           (message "extended test %s" y)))
    (nic-test-1 z)))
如果要将其用作闭包,则需要使用
lexicallet
而不是
或将
词法绑定设置为
T