Рассматривая Practical Common Lisp, мы рассмотрим простую автоматизированную платформу для тестирования модулей. Мы пытаемся, чтобы написать макрос, который будет использоваться в качестве таковых:Переписать петлю в качестве картографа
(check (= (+ 1 2) 3) (= (- 1 4) 9))
Это должно расширить к чему-то, используя предварительно определенную функцию report-result
. Предлагаемая реализация:
(defmacro check (&body forms)
`(progn
,@(loop for f in forms collect `(report-result ,f ',f))))
Однако это расширение кажется для меня довольно процедурным. Я хотел бы заменить loop
с mapcar
расширить на что-то вроде этого:
(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))
Непонятно, что вы просите. Что вам нужно делать? Вы хотите заменить «LOOP» на «MAPCAR» в макросе или должен ли расширенный код содержать «MAPCAR»? –
Ну, честно говоря, мне не пришло в голову, что обе формы возможны. Ответ @ amalloy дает возможное решение для первого. Сначала я пытался написать что-то, чтобы в расширенном коде появился «mapcar». Это также возможно? – Guilherme