Given:
(defn foo [x & {:as args}] [x args])
(foo 1 :bar 2 :baz [:quux])
=> [1 {:bar 2, :baz [:quux]}]
If I have those rest-arguments already in a map, what's the most
elegant way to call foo with them?
(def args {:bar 2 :baz [:quux]})
(foo 1 ?????)
I feel like I may be missing some simple way of doing it. I find
myself needing to do this pretty often, for example any time I have a
chain of functions calling each other that all take keyword arguments
on the end.
(apply foo 1 (apply concat (seq args))) works, but that's awfully
nasty. So this is what I've been doing:
(defmacro apply* [& args]
`(apply ~@(butlast args) (apply concat (seq ~(last args)))))
(apply* foo 1 args)
=> [1 {:bar 2, :baz [:quux]}]
Kind of hacky though. Is there a better/shorter/builtin way?
I can go back to using [x & args] in the function signature and (apply
hash-map args) in the function body, but I love having the keyword
destructuring in the function signature, since the user can see which
keys are valid to pass in, whenever I use {:keys [...]}.
Thanks
--Brian
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en