[racket] [SPAM] metacircular interpreter: recursive macro expanding order ==> Re: metacircular interpreter: macro parser

From: Robby Findler (robby at eecs.northwestern.edu)
Date: Wed Dec 8 07:11:34 EST 2010

Yes, outside in. Inside out doesn't work because the expander only
knows where the inside is when it sees a core (fully expanded) form.

Robby

On Wed, Dec 8, 2010 at 1:44 AM, YC <yinso.chen at gmail.com> wrote:
> Hi all -
> I have now implemented the pattern matching/transforming algorithm of a
> macro expander (no hygiene yet) for a single macro expansion call.  The next
> step is to figure out how to apply the macro expanders recursively "in
> order".
> For example, let's say we want to expand the following:
>
> (or (and #t #t) #f)
>
> Should it be expanded via the head position first (i.e. finish expanding or
> before expanding and)
>
> (or (and #t #t) #f)
> => (let ((g (and #t #t))) (if g g #f))
> => ((lambda (g) (if g g #f)) (and #t #t))
> => ((lambda (g) (if g g #f)) (let ((h #t)) (if h #t #f)))
> => ((lambda (g) (if g g #f)) ((lambda (h) (if h #t #t)) #t))
>
> Or should the arguments be expanded before the head position expanding
> again? (expanding or and and together):
>
> (or (and #t #t) #f)
> => (let ((g (and #t #t))) (if g g #f))
> => (let ((g (let ((h #t)) (if h #t #f)))) (if g g #f))
> => ((lambda (g) (if g g #f)) (let ((h #t)) (if h #t #f)))
> => ((lambda (g) (if g g #f)) ((lambda (h) (if h #t #f)) #t))
>
> Does (and should) it matter either way?  Any inputs are appreciated.
>  Thanks,
> yc
> On Sun, Dec 5, 2010 at 11:21 AM, YC <yinso.chen at gmail.com> wrote:
>>
>>
>> On Sun, Dec 5, 2010 at 10:47 AM, Jon Rafkind <rafkind at cs.utah.edu> wrote:
>>>
>>> Attached is a simple macro expander (but not hygienic) that follows the
>>> algorithm laid out in the paper "Macro by Example" by Wand and others. Its
>>> written in python but the code follows the paper reasonably close so maybe
>>> you can understand it. The paper is on the acm digital library if you can
>>> load it (but for some reason its not loading for me right now, so here is a
>>> google search link to it).
>>>
>>>
>>> http://www.google.com/url?sa=t&source=web&cd=1&ved=0CBgQFjAA&url=http%3A%2F%2Fportal.acm.org%2Fcitation.cfm%3Fid%3D41632&ei=u9z7TPWCMY76sAO__MD3DQ&usg=AFQjCNGnasAUQsGpiVJik29wZRUwHBnz1w
>>>
>>
>> Thanks Jon for the example code and the links to paper.  I don't have
>> access to ACM, but the python code looks quite understandable, even though I
>> am not too familiar with Python.  I will study the code to see what I can
>> glean from it.
>>
>
> _________________________________________________
>  For list-related administrative tasks:
>  http://lists.racket-lang.org/listinfo/users
>


Posted on the users mailing list.