如何动态包装现有函数,例如分析器?

时间:2011-03-23 17:44:46

标签: function macros lisp sbcl

我是Lisp的新手,我正在尝试不同的方法来提高我的技能。我想编写一个包含现有函数的宏,以便我可以在这些函数的表单之前和之后进行设置,有点像CLOS的辅助方法或者Elisp的建议包。 trace函数动态包装代码的能力引起了我的兴趣,能够自己做这件事看起来很有用。

我该怎么做?

请注意我正在使用SBCL,并且出于这个问题的目的,我对这样做的方式并不感兴趣,因为我正在添加到我的Lisp技巧包中。

1 个答案:

答案 0 :(得分:3)

我不知道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)))))