Сохранить оригинальную функцию, локально связать ее с помощью flet и вызвать оригинальную функцию изнутри new? - PullRequest
2 голосов
/ 05 февраля 2012

Subj.Что-то вроде:

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

не работает: (

Ответы [ 2 ]

1 голос
/ 05 февраля 2012

В 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.

1 голос
/ 05 февраля 2012

Надеюсь, это поможет вам с синтаксисом: вызов функции свопа вызывает foo1, но выполняет foo2.

Вы можете написать это как полезный макрос с функцией замены, который связывает старую функцию с новой функцией.во время исполнения тела вы проходите внутрь.

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