查看Practical Common Lisp,我們正在尋找一個簡單的自動化單元測試框架。我們試圖寫一個宏來這樣使用:將循環改寫爲mapcar
(check (= (+ 1 2) 3) (= (- 1 4) 9))
這應該擴大到使用先前定義的函數report-result
東西。建議的實施方式是:
(defmacro check (&body forms)
`(progn
,@(loop for f in forms collect `(report-result ,f ',f))))
但是,擴展對我來說似乎相當程序化。我想用mapcar
更換loop
擴大到這樣的事情:
(mapcar #'(lambda (form) (report-result form 'form)) (list form-1 ... form-n))
不過,我明顯缺乏宏觀的寫作技巧來做到這一點。有人能想出一個這樣的宏嗎?
如果它是相關的,這是report-result
定義:
(defun report-result (result form)
(format t "~:[FAIL~;pass~] ... ~a~%" result form))
目前還不清楚你在問什麼。你想做什麼?你想在宏中用'MAPCAR'代替'LOOP'還是應該擴展的代碼包含一個'MAPCAR'? –
好吧,說實話,我沒有想到這兩種形式都是可能的。 @ amalloy的答案爲前者提供了一個可能的解決方案。我最初試圖寫一些東西,以便在擴展代碼中出現'mapcar'。這也是可能的嗎? – Guilherme