Как динамически обернуть существующие функции, например, для профилировщика? - PullRequest
1 голос
/ 23 марта 2011

Я новичок в Лиспе и пробую разные вещи, чтобы улучшить свои навыки. Я хочу написать макрос, который обернет существующие функции, чтобы я мог настроить формы до и после этих функций, например, вспомогательные методы CLOS или пакет рекомендаций Elisp. Способность функции трассировки динамически переносить код заинтриговала меня, и, кажется, полезно сделать это самостоятельно.

Как я могу это сделать?

Обратите внимание, что я использую SBCL и что для целей этого вопроса меня не очень интересует "правильный" способ сделать это, так как я добавляю в свою сумку для трюков Lisp.

1 Ответ

3 голосов
/ 23 марта 2011

Я не знаю какой-либо встроенной поддержки для этого за пределами CLOS.Но вы можете просто переопределить исходную функцию, например так:

(defmacro add-post (fun-name &body body)
  (let ((orig (gensym)))
    `(let ((,orig (fdefinition ,fun-name))) 
       (setf (fdefinition ,fun-name) (lambda (&rest args)
                                       (apply ,orig args)
                                       ,@body)))))
...