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

Debugging 如何描述要(跟踪)的本地函数?,debugging,common-lisp,trace,Debugging,Common Lisp,Trace,在common lisp中,函数(跟踪名称)可用于查看有关函数调用的输出 如果我的函数是用局部作用域声明的,我如何描述它以进行跟踪 例如,如何跟踪栏,如下所示: (defun foo (x) (labels ((bar (y) (format t "bar: ~a~&" y))) (bar x))) ANSI Common Lisp没有定义使用(TRACE…跟踪本地函数 有些实现有这样做的扩展。例如,见 除此之外,还需要在FOO的定义中添加一些代码。例如,有一个

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

如果我的函数是用局部作用域声明的,我如何描述它以进行跟踪

例如,如何跟踪栏,如下所示:

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

ANSI Common Lisp没有定义使用
(TRACE…
跟踪本地函数

有些实现有这样做的扩展。例如,见


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

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

(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)))

本地函数没有跟踪,没有文档字符串,没有对其父函数的独立重新定义。你放弃了很多。出于这个原因,他们最好有一个很好的理由成为当地人:这个很好的理由是。。。鼓轮。。。需要访问父函数的词法环境。上面的
功能不可用;它可以简单地移动到
foo
之外,作为顶级函数独立运行。