宏对于调试非常有用。但在任何宏观上使用时,它会停下来。就像如果我尝试做到以下几点:宏以及如何跟踪它们
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”。 – Carcigenicate
在什么情况下你想跟踪一个宏?在SBCL中,使用非标准的':ENCAPSULATE'参数来追踪:'(trace push:encapsulate nil)'似乎是可能的。通常宏展开是调试宏的更好方法(使用Sly,你也可以使用宏步)。宏中任何复杂的逻辑都可以在一个单独的函数中实现,这个函数也可以被正常地跟踪。 – jkiiski
谢谢@jkiiski!当我需要知道它在程序中实际做了什么时,宏扩展内置宏(比如'push')不会有太大帮助。 – Mooncrater