On Thu, Aug 28, 2008 at 2:01 AM, Parth Malwankar <[EMAIL PROTECTED]> wrote: > > On Aug 28, 8:13 am, Chouser <[EMAIL PROTECTED]> wrote: >> >> (apply mk-get my-fridge (item-path :mango) :quantity) > > I get an error with this. > > user=> (item-path :mango) > [:fruits :mango] > user=> (apply mk-get my-fridge (item-path :mango) :quantity) > java.lang.IllegalArgumentException: Don't know how to create ISeq > from: Keyword : :quantity
I'm sorry -- remind me not to post untested code after my bedtime. You're right, that won't work. Apply does allow you to provide non-seq arguments followed by the single seq at the end. This is what I was thinking about: user=> (apply + 1 2 3 [4 5 6]) 21 But the apply expression I wrote above has a seq that you want to expand early in the list, and non-seq at the end. As you already discovered, that just throws an exception. So let me start over -- you want a function that takes a mix of keys and vectors of keys, right? You could of course wrap the ones Rich provided for your own use cases. For example if you always have one vector followed by one plain key, you could do: user=> (defn mk-get-1 [m v k] (apply mk-get m (concat v [k]))) #'user/mk-get-1 user=> (mk-get-1 my-fridge (item-path :mango) :quantity) 10 Or if you want to allow any kind of mixed vectors, seqs, and plain keys: user=> (defn mk-get-2 [m & a] (apply mk-get m (mapcat #(if (or (vector? %) (seq? %)) % [%]) a))) #'user/mk-get-2 user=> (mk-get-2 my-fridge (item-path :mango) :quantity) 10 user=> (mk-get-2 my-fridge :fruits [:mango :quantity]) 10 user=> (mk-get-2 my-fridge :fruits (list :mango :quantity)) 10 user=> (mk-get-2 my-fridge :fruits [:mango] :quantity) 10 Neither of these strike me as very general. I don't have my own use cases (yet) for these functions, so I shouldn't speak too confidently, but mk-get-1 seems like a pretty specific case (exactly one vector followed by exactly one plain key). And since vectors are perfectly valid map keys, it's possible to build nested maps that can't be accessed using mk-get-2: user=> (mk-get {[:a :b] :c} [:a :b]) :c user=> (mk-get-2 {[:a :b] :c} [:a :b]) nil --Chouser --~--~---------~--~----~------------~-------~--~----~ 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 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 -~----------~----~----~----~------~----~------~--~---