Thanks Chris for your explanation.
Sunil.

On Fri, Nov 26, 2010 at 6:16 PM, Chris Perkins <chrisperkin...@gmail.com>wrote:

> On Nov 26, 12:25 am, Sunil S Nandihalli <sunil.nandiha...@gmail.com>
> wrote:
> > I just realized that we don't need to use the with-symbol-macros when
> using
> > symbol-macrolet .. but the problem persists all the same..  I have
> modified
> > the gist to reflect this change..
> > Sunil.
> >
> > On Fri, Nov 26, 2010 at 10:35 AM, Sunil S Nandihalli <
> >
> > sunil.nandiha...@gmail.com> wrote:
> > > Hello everybody,
> > >  I am not sure if this is the expected behaviour .. or I am using it
> > > incorrectly .. The code is pasted at
> > >https://gist.github.com/716293.
> >
> > > (ns symbol-macro-problem
> >
> > >   (:require [clojure.contrib.macro-utils :as m]))
> >
> > > (defmacro sym-macro [& body]
> >
> > >   `(m/symbol-macrolet [begin :begin
> >
> > >                        end :end]
> >
> > >                       (m/with-symbol-macros
> >
> > >                         (println begin)
> >
> > >                         ~...@body
> >
> > >                         (println end))))
> >
> > > (defmacro display-local-bindings []
> >
> > >   `(do ~@(map (fn [x#] (list 'println  [`'~x# x#])) (keys &env))))
> >
> > > (sym-macro
> >
> > >  (let [x 10]
> >
> > >    (display-local-bindings)))
> >
> > > the above form is not passing the correct &env variable to the nested
> > > macros .. It is turning out to be nil. The above code just prints
> >
> > > :begin
> > > :end
> >
> > > while
> >
> > > (let [x 10]
> > >   (display-local-bindings))
> >
> > > prints
> >
> > > [x 10]
> >
> > > I was expecting the code
> >
> > > (sym-macro
> > >  (let [x 10]
> > >    (display-local-bindings)))
> >
> > > to print
> >
> > > :begin
> > > [x 10]
> > > :end
> >
> > > but this is not happening since the &env variable that is being passed
> to
> > > (display-local-bindings) is nil when called inside a sym-macro
> > > can somebody help me understand this.
> >
> > > Thanks,
> > > Sunil.
>
> It seems to me that it is probably because the code in macro-utils
> walks down through the forms and manually calls clojure.core/
> macroexpand-1. That calls clojure.lang.Compiler/macroexpand1, which is
> where the local bindings are normally inserted calls to macros (i.e.
> the display-local-bindings macro in this case). But it is being called
> too soon - the compiler has not yet had its chance to walk down
> through the enclosing forms and collect the local bindings, so it
> doesn't know what they are.
>
> I'm pretty sure that macro-utils predates the addition of the &env
> paramter. Since macro-utils takes such an aggressive approach to
> macroexpansion - essentially reimplementing it entirely - it is not
> too surprising that it would become out of sync with the built-in
> expansion mechanism.
>
> - Chris
>
> --
> 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<clojure%2bunsubscr...@googlegroups.com>
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en

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