在常见的lisp中,函数(跟踪名称)可用于查看有关函数调用的输出。
如果我的函数是用本地范围声明的,我该如何描述它来跟踪?
例如,我如何跟踪栏,如下:
(defun foo (x)
(labels ((bar (y) (format t "bar: ~a~&" y)))
(bar x)))
答案 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)),宏将扩展为打印入口和出口的代码。