Welcome! Please see the About page for a little more info on how this works.

0 votes
in Clojure by

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).

3 Answers

0 votes
by

Comment made by: stu

This seems useful. Rich, would you accept a patch?

0 votes
by

Comment made by: stu

Nevermind, just saw that Rich already suggested this on the dev list. Patch away.

0 votes
by
Reference: https://clojure.atlassian.net/browse/CLJ-731 (reported by fogus)
...