如何动态包装现有函数,例如探查器?

发布于 2024-10-26 07:24:46 字数 222 浏览 1 评论 0原文

我是 Lisp 的新手,正在尝试不同的事情来提高我的技能。我想编写一个宏来包装现有的函数,以便我可以为这些函数设置前后表单,有点像 CLOS 的辅助方法或 Elisp 的建议包。跟踪函数动态包装代码的能力引起了我的兴趣,而且我自己能够做到这一点似乎很有用。

我该怎么做?

请注意,我正在使用 SBCL,并且就这个问题而言,我对“正确”的做法并不感兴趣,而对添加到我的 Lisp 技巧包中则更感兴趣。

I am new at Lisp, and am trying different things out to improve my skills. I want to write a macro that wraps existing functions so that I can set up before and after forms for these functions, kind of like CLOS's auxilliary methods or Elisp's advice package. The trace function's ability to wrap code dynamically has intrigued me, and it seems useful to be able to do this myself.

How can I do this?

Please note that I am using SBCL, and that, for the purposes of this question, I am not interested so much in the "right" way of doing this as I am in adding to my Lisp trick bag.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

软的没边 2024-11-02 07:24:46

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

I don't know of any built-in support for this outside of CLOS. But you could just redefine the original function, like this:

(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)))))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文