簡單的中綴巨集

Clojure 使用字首表示法,即:運算子在其運算元之前。

例如,兩個數字的簡單總和將是:

(+ 1 2)
;; => 3

巨集允許你在一定程度上操作 Clojure 語言。例如,你可以實現一個允許你使用中綴表示法編寫程式碼的巨集(例如,1 + 2):

(defmacro infix [first-operand operator second-operand]
    "Converts an infix expression into a prefix expression"
    (list operator first-operand second-operand))

讓我們分解上面程式碼的作用:

  • defmacro 是用於定義巨集的特殊形式
  • infix 是我們定義的巨集的名稱。
  • [first-operand operator second-operand] 是此巨集在呼叫時期望接收的引數。
  • (list operator first-operand second-operand) 是我們巨集觀的主體。它只是建立一個 list,其中包含提供給 infix 巨集的引數值並返回該值。

defmacro 是一種*特殊形式,*因為與其他 Clojure 結構相比,它的行為略有不同:它的引數不會立即被評估(當我們呼叫巨集時)。這使我們能夠寫出如下內容:

(infix 1 + 2)
;; => 3

infix 巨集將 1 + 2 引數擴充套件為 (+ 1 2),這是一個可以評估的有效 Clojure 形式。

如果你想看看 infix 巨集生成什麼,你可以使用 macroexpand 運算子:

(macroexpand '(infix 1 + 2))
;; => (+ 1 2)

如其名稱暗示的 macroexpand 將擴充套件巨集(在這種情況下,它將使用 infix 巨集將 1 + 2 轉換為 (+ 1 2))但不允許 Clojure 的直譯器評估巨集擴充套件的結果。