デバッグ時のprint文挿入

どうせ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:マクロってこんな感じだったかな?久しぶりだから不安

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください