Thanks for the reply Ken. "While the macro is executing "body" will be bound to an s-expression (basically, source code parsed to an AST but no further; source code as processed by the reader). "
This is the part where it falls apart. "body" is actually bound to a single symbol. For example in the destructuring-let macro: (def a [1 2 3]) (let ((x y z) a) (println x y z)) "body" refers to the single symbol "a". Anyway, it seems like what I want is impossible, or at the very least, difficult. I will just have to put up with re-implementing let. Thanks for everyone's contribution -Patrick On Feb 7, 11:45 pm, Ken Wesson <kwess...@gmail.com> wrote: > On Mon, Feb 7, 2011 at 10:06 PM, CuppoJava <patrickli_2...@hotmail.com> wrote: > > I've thought about that actually. And it wouldn't work. > > > So (defn destructure [form value] > > ...magic...) > > > (defmacro let [forms body] > > `(let* ~(vec (destructure forms body)) <- at this point, "body" is > > not known yet. It's just a symbol. > > ~@body) > > > This approach won't work because "body" is only a symbol within the > > macro. We don't know it's value until runtime. > > What? While the macro is executing "body" will be bound to an > s-expression (basically, source code parsed to an AST but no further; > source code as processed by the reader). > > What was being discussed is easy in principle to accomplish. As it > stands we have something like > > (defmacro let [binding-form body] > `(let* ~(some-complex-code-that-emits-a-vector binding-form) > ~@body)) > > already; all that's needed is to lift > "some-complex-code-that-emits-a-vector" out to an explicit function > with binding-form as the sole argument, whose output is a vector of > alternating names and sexps. > > This will then do as a general, runtime-usable destructure function > that turns vectors resembling binding forms into flattened vectors. > You can get the desired maps with a simple additional process of > (reduce (fn [a [b c]] (assoc a b c)) {} (partition 2 the-vector)). > (Maybe (into {} (partition 2 the-vector)) will DTRT with repeated > keys, too.) -- 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