在 common lisp 中,函数(跟踪名称)可用于查看有关函数调用的输出。
如果我的函数是在本地范围内声明的,我该如何描述它以进行跟踪?
例如,我如何跟踪栏,如下:
(defun foo (x)
(labels ((bar (y) (format t "bar: ~a~&" y)))
(bar x)))
在 common lisp 中,函数(跟踪名称)可用于查看有关函数调用的输出。
如果我的函数是在本地范围内声明的,我该如何描述它以进行跟踪?
例如,我如何跟踪栏,如下:
(defun foo (x)
(labels ((bar (y) (format t "bar: ~a~&" y)))
(bar x)))
由于没有跟踪本地函数的标准方法,我解决这个问题的方法是编写一个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)))
(TRACE ...)
ANSI Common Lisp 没有定义跟踪本地函数。
一些实现有扩展来做到这一点。参见例如CMU CL。
除此之外,您需要在 FOO 的定义中添加一些代码。例如,拥有一个宏可能很有用,这样您就可以将对 bar 的调用编写为 (trace-it (bar x)),并且该宏将扩展为打印入口和出口的代码。