Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 如何动态包装现有函数,例如探查器的函数?_Function_Macros_Lisp_Sbcl - Fatal编程技术网

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

Function 如何动态包装现有函数,例如探查器的函数?,function,macros,lisp,sbcl,Function,Macros,Lisp,Sbcl,我是Lisp的新手,正在尝试不同的方法来提高我的技能。我想写一个宏来包装现有函数,这样我就可以为这些函数设置前后表单,有点像CLOS的辅助方法或Elisp的建议包。跟踪函数动态包装代码的能力吸引了我的兴趣,我自己也能做到这一点似乎很有用 我该怎么做 请注意,我正在使用SBCL,出于这个问题的目的,我对“正确”的方法不太感兴趣,因为我正在添加我的Lisp技巧包。我不知道CLOS之外有任何内置的支持。但您可以重新定义原始函数,如下所示: (defmacro add-post (fun-name &a

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

我该怎么做


请注意,我正在使用SBCL,出于这个问题的目的,我对“正确”的方法不太感兴趣,因为我正在添加我的Lisp技巧包。

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

问题:Common Lisp是否允许实现编译引用被调用函数的编译时fdefinition的函数,而不是让它在运行时查找fdefinition?如果是这样的话,那么替换掉FD定义就不一定有效(可能除非
(优化调试)
生效)。我认为适用于CLHS中为
跟踪指定的相同限制:“如果要跟踪的函数是开放编码的(例如,因为它是内联声明的),对该函数的调用可能不会产生跟踪输出。”但这是一种特殊情况,通常应该在运行时查找函数定义。这种后期绑定毕竟使Lisp成为一种动态语言,即使作为一种函数,它也能很好地工作。但是,我必须在代码中的每个位置使用',而不是仅仅使用',fun name。@gamecoder:是的,我假设宏的用户会引用函数名,但在宏定义中引用,就不需要了。