マクロのデバッグ

マクロの練習にcutを作っていたら,デバッグしにくくて困ったので,macro-debugを作ってみた.
マクロを一段階ずつ展開,表示してくれる.

(define-syntax my-cut
  (syntax-rules (<> helper)
    ((_ helper (args ...) (expr ...))
     (lambda (args ...) (expr ...)))
    ((_ helper (x ...) (proc value ...) <> args ...)
     (my-cut helper (x ... y) (proc value ... y) args ...))
    ((_ helper (x ...) (proc value ...) arg args ...)
     (my-cut helper (x ...) (proc value ... arg) args ...))
    ((_ <> b1 ...)
     (my-cut helper (x) (x) b1 ...))
    ((_ b1 b2 ...)
     (my-cut helper () (b1) b2 ...))))

(define (macro-debug form)
  (print form)
  (let1 expanded (macroexpand-1 form)
    (if (equal? expanded form)
        form
        (macro-debug expanded))))

(macro-debug '(my-cut print <> 4))

((my-cut print 3 <>) 4)
((my-cut print <> 4) 3)
((my-cut <> 3 4) print)

macro-debugのお陰でマクロのデバッグがスムーズにできました.
こういうのって最初から入ってないのかなぁ.
マクロ内の変数名が適当すぎた.