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...)))
([f1 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 以便进行验证)。