Сохранить оригинальную функцию, локально связать ее с помощью flet и вызвать оригинальную функцию изнутри new?
Subj. Что-то вроде:
(lexical-let (oldf #'original-func)
(flet ((original-func (arg)
do-something
(funcall oldf arg)))
do-something))
не работает:(
2 ответа
Решение
Надеюсь, это поможет вам с синтаксисом: вызов функции подкачки вызывает foo1, но выполняет foo2.
Вы можете написать это как полезный макрос with-replace-function, который связывает старую функцию с новой функцией при выполнении тела, которое вы передаете.
(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 нет макросов для чтения, вам нужно использовать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
,