如何描述(跟踪)本地函数?

时间:2009-04-08 14:51:22

标签: debugging common-lisp trace

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

如果我的函数是用本地范围声明的,我该如何描述它来跟踪?

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

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

2 个答案:

答案 0 :(得分: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)))

答案 1 :(得分:2)

ANSI Common Lisp未定义使用(TRACE ...)跟踪本地函数。

有些实现有扩展功能。请参阅示例CMU CL

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