MACROEXPAND
宏扩展是将宏转换为实际代码的过程。这通常作为编译过程的一部分发生。编译器将在实际编译代码之前扩展所有宏窗体。在解释 Lisp 代码时也会发生宏扩展。
可以手动调用 MACROEXPAND
来查看宏窗体扩展到什么。
CL-USER> (macroexpand '(with-open-file (file "foo")
(do-something-with file)))
(LET ((FILE (OPEN "foo")) (#:G725 T))
(UNWIND-PROTECT
(MULTIPLE-VALUE-PROG1 (PROGN (DO-SOMETHING-WITH FILE)) (SETQ #:G725 NIL))
(WHEN FILE (CLOSE FILE :ABORT #:G725))))
MACROEXPAND-1
是相同的,但只扩展一次。当试图理解扩展到另一个宏形式的宏形式时,这很有用。
CL-USER> (macroexpand-1 '(with-open-file (file "foo")
(do-something-with file)))
(WITH-OPEN-STREAM (FILE (OPEN "foo")) (DO-SOMETHING-WITH FILE))
请注意,MACROEXPAND
和 MACROEXPAND-1
都不会在所有级别上扩展 Lisp 代码。它们只扩展顶级宏窗体。要在所有级别上完全宏扩展表单,需要使用代码 walker 来执行此操作。Common Lisp 标准中未提供此功能。