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