On Mon, Feb 7, 2011 at 10:06 PM, CuppoJava <[email protected]> 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 [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
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