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

Reply via email to