[gambit-list] output of define-syntax

Marc Feeley feeley at iro.umontreal.ca
Tue Feb 10 08:50:32 EST 2009


On 10-Feb-09, at 3:18 AM, lowly coder wrote:

> Session: ---
>
> ~/dynamic$ cat t2.scm
> (define-macro (assert-equal lhs rhs)
>   (let ((g-lhs (gensym))
>         (g-rhs (gensym))
>         (e-lhs (gensym))
>         (e-rhs (gensym)))
>     `(let ((,g-lhs ,lhs) (,g-rhs ,rhs)
>            (,e-lhs ',lhs) (,e-rhs ',rhs))
>        (if (not (equal? ,g-lhs ,g-rhs))
>            (pp `(,,e-lhs = ,,g-lhs <> ,,g-rhs = ,,e-rhs))))))
>
> (pp (lambda ()
>       (assert-equal (+ 1 2) (- 3 4))) (current-output-port))
>
> ~/dynamic$ gsi t2.scm
> (lambda ()
>   (let ((#:g0 (+ 1 2)) (#:g1 (- 3 4)) (#:g2 '(+ 1 2)) (#:g3 '(- 3 4)))
>     (if (not (equal? #:g0 #:g1))
>         (pp `(,#:g2
>               ,@`
> (,'= ,@`(,#:g0 ,@`(,'<> ,@`(,#:g1 ,@`(,'= ,@`(,#:g3 ,@'())))))))))))
> ~/dynamic$
>
>
> Question: ---
>
> Why do I have:
>
>   (pp `(,#:g2
>               ,@`
> (,'= ,@`(,#:g0 ,@`(,'<> ,@`(,#:g1 ,@`(,'= ,@`(,#:g3 ,@'())))))))))))
>
> ?
>
> It seems prettier as:
>
> `(,#:g2 '= ,#:g0 '<> ...)
>
> the ,@` seems extraneous


The interpreter does a very simple form of compilation of the source  
code to an AST (Abstract Syntax Tree).  What pp is showing you is the  
AST of your code.  pp is not being very smart at prettifying the AST  
of quasiquotes.  It shouldn't be too hard to add a rule such that  
`(X ,@`(Y...)) is turned into `(X Y...).

Marc




More information about the Gambit-list mailing list