[gambit-list] macro-expand
Joel Borggrén-Franck
joel.borggren.franck at gmail.com
Mon Mar 10 18:19:50 EDT 2008
On Mon, Mar 10, 2008 at 3:03 PM, Joel Borggrén-Franck
<joel.borggren.franck at gmail.com> wrote:
> On Sun, Mar 9, 2008 at 12:10 AM, Christian Jaeger
> <christian at pflanze.mine.nu> wrote:
>
> > BTW be careful: macros using (begin ..) to output multiple forms will
> > not give what you want since the current interpreter strips the begin
> > during parsing time:
> >
>
> Thx for the heads up.
>
First i tried:
(define-macro (macro-expand mac)
(let ((port (gensym))
(form (gensym))
(code (gensym)))
`(let ((,port (open-string)))
(pp (lambda () ,mac) ,port)
(let* ((,form (read ,port))
(,code (cddr ,form)))
(cond ((null? ,code) '(begin))
((null? (cdr ,code)) (car ,code))
(else `(begin ,@,code)))))))
It works well. Then I decided to put it all in a let* since it was
only a single expression between the two lets. Wasteful (one
unnecessary (gensym), one extra nested let) or good looking?
;; Expand gambit-c macro form.
(define-macro (macro-expand-dummy mac)
(let ((port (gensym))
(dummy (gensym))
(form (gensym))
(code (gensym)))
`(let* ((,port (open-string))
(,dummy (pp (lambda () ,mac) ,port))
(,form (read ,port))
(,code (cddr ,form)))
(cond ((null? ,code) '(begin))
((null? (cdr ,code)) (car ,code))
(else `(begin ,@,code))))))
/Joel
More information about the Gambit-list
mailing list