5

在 common lisp 中,函数(跟踪名称)可用于查看有关函数调用的输出。

如果我的函数是在本地范围内声明的,我该如何描述它以进行跟踪?

例如,我如何跟踪栏,如下:

(defun foo (x)  
  (labels ((bar (y) (format t "bar: ~a~&" y)))  
    (bar x)))  
4

2 回答 2

3

由于没有跟踪本地函数的标准方法,我解决这个问题的方法是编写一个tracing-labels实现跟踪的宏,转换以下内容:

(defun foo (x)  
  (tracing-labels ((bar (y) (format t "bar: ~a~&" y)))  
    (bar x)))

变成这样的东西:

(defun foo (x)
  (labels ((bar (y)
             (format *trace-output* "~&ENTER: ~S" 'bar)  ;'
             (multiple-value-prog1
                 (progn (format t "bar: ~a~&" y))
               (format *trace-output* "~&LEAVE: ~S" 'bar))))  ;'
    (bar x)))
于 2009-04-08T16:19:19.760 回答
2

(TRACE ...)ANSI Common Lisp 没有定义跟踪本地函数。

一些实现有扩展来做到这一点。参见例如CMU CL

除此之外,您需要在 FOO 的定义中添加一些代码。例如,拥有一个宏可能很有用,这样您就可以将对 bar 的调用编写为 (trace-it (bar x)),并且该宏将扩展为打印入口和出口的代码。

于 2009-04-08T16:07:09.507 回答