Clojure使用前缀表示法,即:运算符位于其操作数之前。
例如,两个数字的简单和为:
(+ 1 2) ;; => 3
宏允许您在一定程度上操纵Clojure语言。例如,您可以实现一个宏,该宏使您可以使用infix表示法(例如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的解释器评估宏扩展的结果。