clojure 简单的固定宏

示例

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