保存原始功能,用flet本地重新绑定它并从新的内部调用原始功能?

时间:2012-02-05 15:50:36

标签: emacs elisp

SUBJ。 类似的东西:

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

不起作用:(

2 个答案:

答案 0 :(得分:1)

希望这会帮助您使用语法,调用swap-function调用foo1但执行foo2。

你可以把它写成一个有用的宏with-replace-function,它在执行你传入的体时将旧函数与new函数绑定。

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

答案 1 :(得分:1)

emacs-lisp中没有读取器宏,您需要使用 明确地symbol-function

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

如果您想将其用作闭包,则需要使用lexical-let 代替let或将lexical-binding设置为T