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 <ro...@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.c...@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.c...@gmail.com> wrote: >>> >>> >>> On Sun, Dec 5, 2010 at 10:47 AM, Jon Rafkind <rafk...@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 >> > _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users