[gambit-list] debugging macros

Marc Feeley feeley at iro.umontreal.ca
Tue Jan 27 15:51:27 EST 2009


On 27-Jan-09, at 2:34 PM, eryiling wrote:

> suppose I have:
>
> (define-macro (foo ...))
>
> the standard way to 'debug' this is to do:
>
> (pp (lambda () (foo ...)))
>
> however, this requires that (foo ...) expands to proper scheme code  
> (i.e. not things like "(a b . c)"), and also code that has well  
> defined semantic meaning (i.e. no undefined vars)
>
> as i write macros, i find that most of the time (in fact, except for  
> the starting point and the ending point), my macro  expansion offten  
> results in non-scheme code; is there a way i can see this output?  
> i.e. I wnat to see:
>
> (macroexpand '(foo ...))
>
> rather than the particular error for why (foo ... ) does not expand  
> to legit scheme code
>
> thanks!

Here's the trick I often use.  Say you have the macro definition:

(define-macro (foo x y)
   ...something...)

you simply add a (list 'quote ...) around the body of your macro:

(define-macro (foo x y)
   (list 'quote ...something...))

Then when you can do

(pp (foo 1 2))

and this will print the s-expression that ...something... generated.

For example:

% gsi
Gambit v4.4.0

 > (define-macro (bind var val expr)
     (list 'quote `(let ((,var ,val)) ,expr)))
 > (pp (bind x (+ 1 2) (* x x)))
(let ((x (+ 1 2))) (* x x))

Once you are done debugging, you strip off the (list 'quote ...)  
wrapper.

Marc





More information about the Gambit-list mailing list