2

これが私のマクロ定義です:

*(defmacro run-test (test)
   `(format t "Run test ~a ... ~a" ',test ,test))
*(run-test (= 1 1))
Run test (= 1 1) ... T
NIL

今のところすべて正常に動作するので、2 つ目のマクロを定義しました (複数のテストを実行するため)。

*(defmacro run-tests (&body body) 
   `(loop for tc in ',body 
      do (run-test tc)))
* (run-tests (= 2 (1+ 1)) (= 1 1))
Run test TC ... (= 2 (1+ 1) Run test TC ... (= 1 1)

この結果は私が望んでいたものではありません. の各値をtcSEXP に置き換え、その値を実行テストで評価したかったのです. ライン交換してみた

          do (run-test tc)

          do (run-test ,tc)

しかし、これはエラーを示します

未定義変数: TC

これを変更して正しい結果を得るにはどうすればよいですか?

4

2 に答える 2

10

eg の展開を見てください(run-tests (= 1 1)):

(loop for tc in '((= 1 1)) do (run-test tc))

ご覧のとおり、コードは を呼び出そうとします(run-test tc)。しかしrun-test、フォーム上で動作します。フォームを含む変数を渡すと機能しません。

コードを変更すると、マクロ展開時に変数(run-test ,tc)を参照しようとしますがtc、実行時にのみバインドされます。

1 つの解決策は、マクロ展開時にさらに多くのことを行うことです。

(defmacro run-tests (&body body)
  `(progn ,@(loop for tc in body collect `(run-test ,tc))))
于 2013-10-15T05:40:27.810 に答える