That works - thanks. Still, it seems intuitive to build the code as I had originally done. It's too bad code has to get complicated so quickly :) Thank again for the help.
On Jan 3, 9:19 pm, Robert Marianski <r...@marianski.com> wrote: > On Tue, Jan 03, 2012 at 07:22:22PM -0800, Trevor wrote: > > hmmm.... macro question: > > > ; here's a macro that assembles many puts. It serves no purpose to me > > (and doesn't even make sense in its current form). It's just something > > I hit playing around and learning macros. > > > (defmacro doto-putter [x y xs] > > `(doto (java.util.HashMap.) > > (.put ~x ~y) > > ~@(for [[k v] xs]`(.put ~k ~v)))) > > > user=> (doto-putter "c" 3 {"a" 1 "b" 2}) > > #<HashMap {b=2, c=3, a=1}> > > > however: > > > =>(defn omg [x y xs](doto-putter x y xs)) > > CompilerException java.lang.IllegalArgumentException: Don't know how > > to create ISeq from: clojure.lang.Symbol, compiling:(NO_SOURCE_PATH:2) > > > I'm thinking the issue seems to be that it's not resolving xs because > > this works: > > > (defmacro doto-putter [x y] > > `(doto (java.util.HashMap.) > > (.put ~x ~y) > > ~@(for [[k v]{"a" 1 "b" 2}]`(.put ~k ~v)))) > > > user=> (defn omg [x y](doto-putter x y)) > > #'user/omg > > > user=>(omg "c" 3) > > #<HashMap {b=2, c=3, a=1}> > > > what am I missing? None of my other macros have this problem. > > Keep in mind that you are trying to iterate through xs at compile time. > All you have at that point is a symbol, so effectively you are trying > this: > (for [[k v] 'xs] ...) > > That's why you are getting the error above; you are trying to iterate > through a symbol. There isn't a way around this, because it's impossible > to know the keys/values at compile time. > > What you need to do instead is generate the code to iterate through the > map instead of actually iterating through at compile time. Something > like this: > > (defmacro doto-putter [x y xs] > `(let [h# (java.util.HashMap.)] > (.put h# ~x ~y) > (dorun (for [[k# v#] ~xs] > (.put h# k# v#))) > h#)) > > Hope that helps, > Robert -- 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