The manual says to use pp as a macro expander:
(define-macro (push var #!optional val)
`(set! ,var (cons ,val ,var)))
(pp (lambda () (push stack 1) (push stack) (push stack 3)))
(lambda () (set! stack (cons 1 stack)) (set! stack (cons #f stack)) (set! stack (cons 3 stack)))
Since I got tired of the extra writing and the lambda in the output, I wrote my own macro-expand macro based on the pp example from the manual:
;; Expand one a gambit-c macro form. (define-macro (macro-expand mac) (let ((port (gensym)) (form (gensym))) `(let ((,port (open-string))) (pp (lambda () ,mac) ,port) (let ((,form (read ,port))) (caddr ,form)))))
It works as I expect:
(macro-expand (macro-expand 0))
(let ((#:g2 (open-string))) (pp (lambda () 0) #:g2) (let ((#:g3 (read #:g2))) (caddr #:g3)))
but it strikes me as a bit inelegant.
Is there a better solution? Is there a way to read from pp without creating a port first? I played around with with-output-to-string first but that just gave me a headache.
/Joel