Another hack I use for syntax-rules macros is to modify the definition. Here's a macro from JRM's Syntax-Rules Primer for the Mildly Eccentric:
(define-syntax bind-variables
(syntax-rules ()
((bind-variables () form . forms)
(begin form . forms))
((bind-variables ((variable value0 value1 . more) . more-bindings) form . forms)
(syntax-error "bind-variables illegal binding" (variable value0 value1 . more)))
((bind-variables ((variable value) . more-bindings) form . forms)
(let ((variable value)) (bind-variables more-bindings form . forms)))
((bind-variables ((variable) . more-bindings) form . forms)
(let ((variable #f)) (bind-variables more-bindings form . forms)))
((bind-variables (variable . more-bindings) form . forms)
(let ((variable #f)) (bind-variables more-bindings form . forms)))
((bind-variables bindings form . forms)
(syntax-error "Bindings must be a list." bindings))))
And here's what I do to it:
(define-syntax bind-variables
(syntax-rules ()
((bind-variables () form . forms)
'(begin form . forms))
((bind-variables ((variable value0 value1 . more) . more-bindings) form . forms)
'(syntax-error "bind-variables illegal binding" (variable value0 value1 . more)))
((bind-variables ((variable value) . more-bindings) form . forms)
'(let ((variable value)) (bind-variables more-bindings form . forms)))
((bind-variables ((variable) . more-bindings) form . forms)
'(let ((variable #f)) (bind-variables more-bindings form . forms)))
((bind-variables (variable . more-bindings) form . forms)
'(let ((variable #f)) (bind-variables more-bindings form . forms)))
((bind-variables bindings form . forms)
'(syntax-error "Bindings must be a list." bindings))))
By inserting the ' mark before the right side of each rewrite rule, when I invoke nth-value it will display the code rather than evaluating it. This does not handle recursion or hygiene, though. If you want it to handle hygiene, don't use quote but wrap each right side in (write ...) instead.