【发布时间】:2017-12-05 22:30:36
【问题描述】:
trace 宏对于调试非常有用。但是,当用于任何宏时,它会停止。就像我尝试执行以下操作一样:
CL-USER> (trace push)
然后,它会报错:
can't use encapsulation to trace anonymous function #<FUNCTION (MACRO-FUNCTION
PUSH) {100053FB9B}>
[Condition of type SIMPLE-ERROR]
嗯,这很明显,因为trace 的 clhs 页面清楚地定义了函数。那么,Common Lisp 中没有任何跟踪宏的工具的原因是什么?
在 Common Lisp 中是否有任何其他(非常规)方法来跟踪宏?
【问题讨论】:
-
好吧,如果宏在编译时扩展,你将如何跟踪它们的调用?您也许可以编写一个宏来选择扩展宏的第一种形式并在其上调用
trace。 -
在什么情况下要跟踪宏?在 SBCL 中,似乎可以使用非标准的
:ENCAPSULATE参数来跟踪:(trace push :encapsulate nil)。通常宏扩展是调试宏的更好方法(使用 Sly,您也可以使用宏步)。宏中的任何复杂逻辑都可以在单独的函数中实现,也可以正常跟踪。 -
谢谢@jkiiski!当我需要知道它在程序中实际做了什么时,宏扩展内置宏(如
push)并没有多大帮助。
标签: debugging macros common-lisp trace