Consider a function with the following signature:
(defn make-widget [& {:keys [x y] :or {x 10 y 20}}]
...)
What is the best way to pass a
I can't think of a more elegant way, either, though it seems to me to that there should be one (like a map-specific variant of apply
).
Using flatten
has problems beyond not being very elegant, though. If the values of your map are collections, flatten
will work recursively on those, too, so things could get totally mixed up. This alternative avoids that problem:
(apply make-widget (apply concat {:x 100}))
You can use:
(apply make-widget (mapcat identity {:x 200 :y 0}))
There is also a known (not invented by me at least), function "mapply":
(defn mapply [f & args] (apply f (apply concat (butlast args) (last args))))
which can be applied like
(mapply your-function {:your "map"})
As to why is this language-specific functionality absent from Clojure core, being implemented more natively and elegantly, no one could ever give me a clear answer.
UPDATE
After I have spent much time programming in Clojure, I personally tend to refrain from creating functions that accept a {}
as a vararg. Although at first this can seem appealing, in reality experience proves that passing an explicit {}
is always better for many reasons.