Clojure

目录

Clojure 拥有一个可编程的宏系统,允许用户代码扩展编译器。宏可以用于定义语法结构,这些结构在其他语言中需要基本类型或内置支持。许多 Clojure 的核心结构实际上并不是基本类型,而是普通的宏。

一些宏产生基本形式的简单组合。例如,whenifdo 组合在一起。

user=> (macroexpand '(when (pos? a) (println "positive") (/ b a)))
(if (pos? a) (do (println "positive") (/ b a)))

其他宏以有用的方式重新排列形式,例如 -> 宏,它递归地将每个表达式插入为下一个表达式的第一个参数。

user=> (-> {} (assoc :a 1) (assoc :b 2))
{:b 2, :a 1}
user=> (macroexpand '(-> {} (assoc :a 1) (assoc :b 2)))
(assoc (assoc {} :a 1) :b 2)

特殊变量

在 defmacro 内部可以使用两个特殊变量进行更高级的用法。

  • &form - 正在调用的实际形式(作为数据)。

  • &env - 宏展开时局部绑定的映射。env 映射是从符号到包含该绑定的编译器信息的对象的映射。

以下所有宏都在 API 页面中进行了说明。许多宏也在主题页面上进行了讨论,如注释所示。

一些 特殊形式 实际上是作为宏实现的,主要是为了提供解构: fn let loop