Clojure 包含一系列组合器,它们的实现方式相似但略有所不同。也就是说,它们在调用一端及其返回的函数上都是完整的多态重载。从外观上看,它们通常会像这样:
`
(defn foo
([f]
(fn
([] do stuff...)
([x] do stuff...)
([x y] do stuff...)
([x y z] do stuff...)
([x y z & args] do variadic stuff...)))
([f f2]
(fn
([] do stuff...)
([x] do stuff...)
([x y] do stuff...)
([x y z] do stuff...)
([x y z & args] do variadic stuff...)))
([f1 f2 f3]
(fn
([] do stuff...)
([x] do stuff...)
([x y] do stuff...)
([x y z] do stuff...)
([x y z & args] do variadic stuff...)))
([f1 f2 f3 & fs]
(fn
([] do stuff...)
([x] do stuff...)
([x y] do stuff...)
([x y z] do stuff...)
([x y z & args] do variadic stuff...))))
`
为每个组合器编写这种类型的函数既繁琐又容易出错。
必须有一种方式来实现一个宏,它接受组合器的“规范”,包括
- 名称
- 文档字符串
- 执行操作模板
- 执行可变操作模板
并构建出类似于上面的{{foo}}函数。这个宏应该能够实现当前的组合器批量(假设http://dev.clojure.org/jira/browse/CLJ-730 已先完成,以便验证)。