這裏是我的宏定義:未定義的變量,而unquoting宏觀
*(defmacro run-test (test)
`(format t "Run test ~a ... ~a" ',test ,test))
*(run-test (= 1 1))
Run test (= 1 1) ... T
NIL
一切正常,現在,我已經定義了一個第二個宏(運行多個測試):
*(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)
這個結果並不是我想要的,我希望tc
的每個值都被sexp替換,並且在運行測試中評估該值。我試着用
do (run-test ,tc)
更換線
do (run-test tc)
但這發出錯誤信號,
未定義的變量:TC
我怎樣才能改變這種獲得正確的結果?
我喜歡使用'loop'來構造宏展開的可能解決方案。一般來說,手工編寫至少一次代碼是宏應擴展到的_desired_代碼的有用方法。在這種情況下,它應該是'(progn(run-test form1)(run-test form2)...)',並且從這個角度看,'loop'顯然是獲得它的好方法。 –
非常好的解決方案。我再次查看了LISP宏的細節。我錯了解宏觀擴展階段和運行階段。 –