簡單的中綴巨集
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 的直譯器評估巨集擴充套件的結果。