実践Common lispを読み始めた-第9章 マクロ:ユニットテストフレームワーク
Unitテストを題材に、Lispで書いたらこんなに簡単になるよという話。
関数とマクロを使って、ボトムアップでフレームワークを作っていく。
(defun report-result (result form) (format t "~:[FAIL~;pass~] ... ~a~%" result form)) (defun test-+ () (report-result (= (+ 1 2) 3) '(= (+ 1 2) 3)) (report-result (= (+ 1 2 3) 6) '(= (+ 1 2 3) 6)
のようにテストケースの式自体とreport-resultがレポート用に使う式に同じ式を2回書くのは面倒だし、間違いやすい。
こんなときに、
(defmacro check (form) `(report-result ,form ',form))
というマクロを組むと関数test-+が
(defun test-+ () (check (= (+ 1 2) 3)) (check (= (+ 1 2 3) 6)))
にまとめられる。確かにマクロじゃないとうまくいかないな。これは便利だと思った。