I have a number of fairly nasty functions with a form that looks like
this:

(defn default-ontology
  ([f]
     (dispatch f))
  ([f a]
     (dispatch f a))
  ([f a b]
     (dispatch f a b))
  ([f a b c]
     (dispatch f a b c))
  ([f a b c d]
     (dispatch f a b c d))
  ([f a b c d e]
     (dispatch f a b c d e))
  ([f a b c d e fa]
     (dispatch f a b c d e fa))
  ([f a b c d e fa g]
     (dispatch f a b c d e fa g))
  ([f a b c d e fa g h]
     (dispatch f a b c d e fa g h))
  ([f a b c d e fa g h i]
     (dispatch f a b c d e fa g h i))
  ([f a b c d e fa g h i j]
     (dispatch f a b c d e fa g h i j)))

The reason for all of this is that I need to avoid the use of variadic
function calls for performance reasons -- this function gets called a
lot in my code base, and without this unwinding, I box and unbox
consistantly.

Now, I dislike the code repetition here, and indeed have found already
found one bug in my code where I missed a variable out, something like....

([f a b c d]
 (dispatch f a b d))

which is hard to pick up on.

I can't make the whole thing a macro because I need to pass this as a
first class function. And I can't macro each of the variadic elements
since the I'd need to return two elements at once.

The best I have done up with so far is:

(defn ^:private form-with-arity[n]
  ;; left as an exercise for the reader    
)

(defmacro ^:private m-default-ontology
  `(defn default-ontology
      ~@(map form-with-arity (range 1 10))))

(m-default-ontology)

Or am I missing something more obvious?

Phil

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to