巨集

巨集的目的

巨集用於生成程式碼,轉換程式碼和提供新的符號。這些新的符號可以更適合於更好地表達程式,例如通過提供域級構造或全新的嵌入式語言。

巨集可以使原始碼更加不言自明,但除錯可能會變得更加困難。根據經驗,當常規函式執行時,不應該使用巨集。當你使用它們時,避免常見的陷阱,嘗試堅持常用的模式和命名約定。

巨集擴充套件訂單

與函式相比,巨集以相反的順序擴充套件; 最重要的是,最後一次。這意味著預設情況下,不能使用內部巨集來生成外部巨集所需的語法。

評估訂單

有時巨集需要移動使用者提供的表單。必須確保不要改變它們的評估順序。使用者可能依賴於按順序發生的副作用。

僅評估一次

巨集的擴充套件通常需要多次使用同一個使用者提供的表單的值。表格可能會產生副作用,或者可能會呼叫昂貴的功能。因此巨集必須確保只評估一次這樣的形式。通常,這將通過將值賦給區域性變數(其名稱為 GENSYMed)來完成。

巨集使用的函式,使用 EVAL-WHEN

複雜的巨集通常在不同的函式中實現其邏輯的一部分。但是,必須記住,在編譯實際程式碼之前會擴充套件巨集。編譯檔案時,預設情況下,在巨集執行期間,同一檔案中定義的函式和變數將不可用。巨集使用的同一檔案中的所有函式和變數定義必須包含在 EVAL-WHEN -form 中EVAL-WHEN 應該指定所有三次,當在載入和執行時期間也應該評估所附的程式碼。

(eval-when (:compile-toplevel :load-toplevel :execute)
  (defun foobar () ...))

這不適用於從巨集的擴充套件呼叫的函式,只適用於巨集本身呼叫的函式。