デバッグ難航 - Scheme VM を書く
コンパイラを VM on Gauche で動かしている。
特定のコードをコンパイルしようとするとコードが想定しない動きをして落ちてしまう。
原因をひたすら調べている。
- おかしくなる手続きを特定
- 同じ引数で呼んでみる →落ちない
- pass1 の展開結果を見る →正常
- コンパイル結果を眺める →正常に見える
ちとお手上げ気味なので VM の状態が正常かどうかを 1 インストラクション毎にチェックすることにした。
以下は補助マクロ
(define-macro (debug-case val . clauses) `(case ,val ,@(map (lambda (x) `(,(car x) (let1 debug-clause (quote ,(car x)) ,@(cdr x)))) clauses))) (define-macro (check-vm-paranoia pred) `(unless ,pred (error "** vm check paranoia " (quote ,pred) " on " debug-clause)))
debug-case マクロは case の代わり使うことで各 clause 内で debug-clause という変数が参照できるようになります。