On Jun 16, 2010, at 9:21 PM, Michael Gardner wrote:

On Jun 16, 2010, at 7:07 PM, ataggart wrote:

There's a disconnect between the function definition and the
datastructures used by the caller.

Either fix the data structure:
(def args [:bar 2 :baz [:quux]])
then use apply

Or change the function definition to take a map:
(defn foo [x {:keys [bar baz]}]
...)

That's a pretty flippant answer. I have run into this same issue; it's not always desirable to have your function take a map, and if you get the data structure from elsewhere (say loaded from a config file), then you have to resort to either re-building the arg list manually or doing (apply concat ...).

Regarding Brian's original question: as far as I know, there is no built-in version of apply that works with keyword args contained in a map. But note that you can eliminate the call to seq, since (apply concat args) works the same as (apply concat (seq args)).

This is fairly simple:

user=> (defn foo [& {:as args}] [args])
#'user/foo
user=> (def m {:a 5 :b 6})
#'user/m
user=> (apply foo (-> m seq flatten))
[{:a 5, :b 6}]

I'm not sure if it could be made easier, short of changing apply (which I wouldn't think is reasonable).

- Chas

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

Reply via email to