### [CLJ-731] Create macro to variadically unroll a combinator function definition Created: 26/Jan/11  Updated: 26/Jul/13

Status: Open
Project: Clojure
Component/s: None
Affects Version/s: None
Fix Version/s: Backlog

 Type: Enhancement Priority: Minor Reporter: Fogus Assignee: Unassigned Resolution: Unresolved Votes: 2 Labels: None

 Approval: Vetted

 Description
 Clojure contains a set of combinators that are implemented in a similar, but slightly different way. That is, they are implemented as a complete set of variadic overloads on both the call-side and also on the functions that they return. Visually, they all tend to look something like: ```(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...)))) ``` To build this type of function for each combinator is tedious and error-prone. There must be a way to implement a macro that takes a "specification" of a combinator including: 1. name 2. docstring 3. do stuff template 4. do variadic stuff template And builds something like the function foo above. This macro should be able to implement the current batch of combinators (assuming that http://dev.clojure.org/jira/browse/CLJ-730 is completed first for the sake of verification).