These inconsistencies are bugging me, I just wondered if I was missing some 
standard language thing about argument passing or destructuring, so I'm 
looking for comments.

At issue (for me), keyword arguments and maps that bundle them.

user> (defn foo [a b & {:keys [c d]}]
        [a b c d])
#'user/foo
user> (defn bar [a b & {:keys [c d] :as options}]
        (println (apply foo a b options)))
#'user/bar
user> (bar 1 2)
[1 2 nil nil]
nil
;; Okay so far

user> (bar 1 2 :c 3)
IllegalArgumentException No value supplied for key: [:c 3] 
 clojure.lang.PersistentHashMap.create (PersistentHashMap.java:77)

;; I'm wishing the above was smarter, but okay, so I use 'mapply', which 
seems to me it ought to be in clojure.core but isn't.

user> (defn mapply
  [f & args]
  (apply f (apply concat (butlast args) (last args))))
#'user/mapply
user> (defn bar2 [a b & {:keys [c d] :as options}]
        (println (mapply foo a b options)))
#'user/bar2
user> (bar2 1 2 :c 3)
[1 2 3 nil]
nil

;; Okay, that works nicely


So maybe this is all fine, though if there's some standard way of doing 
this using things shipped with clojure please let me know.

However then 'recur' bucks the trend, which adds to confusion.

user> (defn baz [a b & {:keys [c d] :as options}]
        (if (> a 0)
          (recur (- a 1) b options)
          [a b c d]))
#'user/baz
user> (baz 2 3 :c 4)
[0 3 4 nil]

So recur does this arguably very useful thing, but apply does not (and 
probably with good reason, otherwise how would we pass maps as regular 
arguments...)

I guess what I'm seeking is the canonical clojure approach to dealing with 
keyword arguments and maps in call sites, and I find
the apply/recur difference confusing, and the lack of 'mapply' an oversight.

Thoughts?  Comments?  Please educate on what I'm missing, thanks.

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