在调用中执行表单时的Common Lisp宏

时间:2018-06-15 18:51:02

标签: 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
Time block 2: (+ c b) = 3 sec

也就是说,我想对函数进行外部调用,同时能够在其中指出我想特别关注的块。

问题是这样的事情是否已经存在。此外,如果我需要实现这一点,你会建议从哪里开始或一些有用的功能/宏为此。不一定寻找可行的解决方案,但欢迎指导和指导:)

1 个答案:

答案 0 :(得分:2)

(time-lisp-forms (test 1 2))

可以扩展为:

(let ((*counter* (make-counter :forms '((test 1 2)))))
  (test 1 2)
  (print-summary *counter*))

(或扩展为对执行相同功能的函数的调用)。

您将*counter*变量动态绑定到counter类的实例。

您的自定义(time expr)表达式会扩展为:

`(call-time-block *counter* ',expr (lambda () ,expr))

然后,该函数会为测试提供一个新的id(1,2等),并使用GET-INTERNAL-RUN-TIME获得一个内部前/后计数器来测量时间。