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