デバッグ時のprint文挿入
2008/05/02
どうせprintfデバッグしかしないんだから、
tapは便利かも – ボクノス
tapの方向性とはどんどんずれていきますが、common lispのマクロを使う方法の場合。
長いS式の値の場合、(p の閉じカッコ入力するのが面倒だと思ったので、デバッグ用にprintしたいS式の前に、#? を書くと直後のS式を評価した結果のprint文を挿入するマクロを書いてみました。*1
マクロ定義
(set-dispatch-macro-character #\# #\? #'(lambda (stream char1 char2) (let ((sexp (gensym))) `(let ((,sexp ,(read stream t nil t))) (print ,sexp) ,sexp))))
使用例
(defun rec (a &optional (acc 0)) (if (plusp a) (rec (1- a) (+ a acc)) acc)) (format t "~&answer: ~d~%" (rec 10))
こんな関数のデバッグをしたかったら、rec関数のどこかで、確認したいS式の前に #?を付けると
(defun rec (a &optional (acc 0)) (if (plusp a) (rec (1- a) #?(+ a acc)) acc)) (format t "~&answer: ~d~%" (rec 10))
実行結果
10 19 27 34 40 45 49 52 54 55 answer: 55
のように、print文が挿入された結果が表示されます。#?を前置するだけでいいのですこし簡単になりました。実際のデバッグ時に使うかどうかは微妙ですが。
*1:マクロってこんな感じだったかな?久しぶりだから不安