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