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