简单的中缀宏

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