[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:13:43 EST 2010

PS: check out this paper for an algorithm:

  http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.54.8909

Robby

On Wed, Dec 8, 2010 at 6:11 AM, Robby Findler
<robby at eecs.northwestern.edu> wrote:
> 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.