Macros 公共Lisp宏,用于对调用内表单的执行进行计时

Macros 公共Lisp宏,用于对调用内表单的执行进行计时,macros,common-lisp,Macros,Common Lisp,我目前需要编写类似于user::time的东西,但需要修改 修改如下。假设我的新宏名为time lisp forms。那我就可以这样用了 (defun test (a b) (let ((c (+a b))) (time (+ c a)) (time (+ c b))))) 我这样称呼宏: (time-lisp-forms (test 1 2)) Total time for (test 1 2) = 5 sec Time block 1: (+ c a) = 1 sec

我目前需要编写类似于
user::time
的东西,但需要修改

修改如下。假设我的新宏名为
time lisp forms
。那我就可以这样用了

(defun test (a b)
  (let ((c (+a b)))
    (time (+ c a))
    (time (+ c b)))))
我这样称呼宏:

(time-lisp-forms (test 1 2))
Total time for (test 1 2) = 5 sec
Time block 1: (+ c a) = 1 sec
Time block 2: (+ c b) = 3 sec
然后,它的输出是这样的:

(time-lisp-forms (test 1 2))
Total time for (test 1 2) = 5 sec
Time block 1: (+ c a) = 1 sec
Time block 2: (+ c b) = 3 sec
也就是说,我希望对函数的外部调用进行计时,同时能够指出函数内部我特别想关注的块

问题是这样的事情是否已经存在。此外,如果我需要实现此功能,您会建议从何处开始,或者为此提供一些有用的函数/宏。不一定要寻找有效的解决方案,但欢迎提供指导:)

可扩展为:

(let ((*counter* (make-counter :forms '((test 1 2)))))
  (test 1 2)
  (print-summary *counter*))
`(call-time-block *counter* ',expr (lambda () ,expr))
(或展开为对执行相同操作的函数的调用)

*计数器*
变量动态绑定到
计数器
类的实例

您的自定义
(时间表达式)
表达式将扩展为:

(let ((*counter* (make-counter :forms '((test 1 2)))))
  (test 1 2)
  (print-summary *counter*))
`(call-time-block *counter* ',expr (lambda () ,expr))

然后,该函数将为测试提供一个新id(1、2等),并使用使用获得的内部前后计数器测量时间。

您是否建议在这种情况下使用两个宏?一个用于外部调用,一个用于内部块?是的,只是为了简化高阶函数的语法。