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 標準中未提供此功能。