简单的中缀宏
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 的解释器评估宏扩展的结果。