Hi,

im just porting Chapter 19 to clojure (my objective is to learn
macros). (For those that do not know the book: A database system is
introduced that can hold and query painters). It goes nicely until the
macro with-answer, which generate bindings on-the-fly so that one can
say

(with-answer (painter ?a ?b english) (prn ?a))

and the system will print the names of the english painters. So with-
answer has two arguments, the first is the query and the second is a
block of code which is then evaluated using the bindings that are
generated by the query. I thought it would be possible to write a
macro that generates something like (let [?a name1] (prn ?a)), but I
was not able to do so. Why is that? Is there a trick?

The problem boils down to this: Write a macro dynlet that can be
called like this

(def bds '[a 42])
(dynlet bds (prn a))

and will print 42.

I came up with

(defmacro dynlet [bvec body]
    `(let ~bvec
       ~body))

but this only works if the vector with the bindings is given directly
to the macro like this:
(dynlet [a 42] (prn a))

How does one do this in clojure?

I was able to solve the original problem by doing a string-replace of
the variables in the body with the generated values like this:

(defmacro with-answer [query body]
  `(do
       ~@(map
        (fn [x]
          (let [rbody# (walk/postwalk-replace x body)]
            rbody#)
          )
        (interpret-query query)))
)

but of cause this is not the same as the original thing. It has to be
called like this
(with-answer (painter ?a ?b english) (prn '?a))
and the last quote is sadly necessary.

I would greatly appreciate some help here!

TIA,

Michael



-- 
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