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

请注意,MACROEXPANDMACROEXPAND-1 都不会在所有级别上扩展 Lisp 代码。它们只扩展顶级宏窗体。要在所有级别上完全宏扩展表单,需要使用代码 walker 来执行此操作。Common Lisp 标准中未提供此功能。