非常に強力な Lisp マクロを完全に理解しようとする中で、ある疑問が頭に浮かびました。マクロに関する黄金律は、 「関数が機能するときは決してマクロを使用しない」というものであることを私は知っています。ただし、Chapter 9 - Practical: Building a Unit Test Framework - 本から Practical Common Lisp を読んで、以下のマクロを紹介しました。このマクロの目的は、テスト ケース式の重複を取り除くことであり、それに伴う結果の誤ったラベル付けのリスクがあります。
;; Function defintion.
(defun report-result (result form)
(format t "~:[FAIL~;pass~] ... ~a~%" result form))
;; Macro Definition
(defmacro check (form)
`(report-result ,form ',form))
OK、その目的は理解できましたが、マクロの代わりに関数を使用することもできました。たとえば、次のようになります。
(setf unevaluated.form '(= 2 (+ 2 3)))
(defun my-func (unevaluated.form)
(report-result (eval unevaluated.form) unevaluated.form))
- これは、指定されたマクロが単純すぎるためにのみ可能ですか?
- さらに、Lisp マクロ システムは、コード自体 (制御構造、関数など) が LIST として表されているため、反対者に比べて非常に強力ですか?