pass2 のデバッグを少しでも簡単に
pass2 のどこかでおかしな最適化が施されてしまう問題に悩まされる。2分法で調べるために適当にログをとりながら調べたが分からず。あの構造で再帰しまくるとデバッグが難しい。
ちょっと落ち着いて考える。適当に一部のログだけをとったのが分かりづらさの一因であることに気付く。IN と OUT を全部ログに出力してしまえという仕組みを作った。
原始的だがすぐにバグの原因が判明。この技が使えるのは再帰の階層がそこまで深くないとき。
いっそのこと再帰の深さも出力できるようにしようかな。
(define-macro (define-pass2/tracable init . body) (if #f (match init [(name . var) (let1 ret (gensym) `(define ,init (format #t "[~a] IN =>\n" ',name) (pp-iform ,(car var)) (let1 ,ret (begin ,@body) (format #t "[~a] OUT =>\n" ',name) (pp-iform ,(car var)) (display "\n") ,ret)))] [else (error 'define-pass2/tracable "invalid syntax")]) `(define ,init ,@body)))