А оговаривается ли где-то в стандарте порядок раскрытия макросов?
Репост отсюда вот:
http://lisper.ru/forum/thread/126 Дело в том, что ради интереса попробовал реализовать вот такую штуку
(eval-when (:compile-toplevel :load-toplevel :execute)
(defvar *cleaners* '()))
(defmacro with-cleaners ((&rest resources) &body body)
"Each resource is of form (name value)"
(setf *cleaners* '())
`(let ,resources
(macrolet ((add-cleaner (&body cleaner-body)
(push cleaner-body *cleaners*)
nil)
(invoke-cleaners ()
`(progn ,@(reduce #'nconc *cleaners*)
,(setf *cleaners* '()))))
(unwind-protect
(progn ,@body)
(invoke-cleaners)))))
и обнаружил, что оно не везде работает так, как хотелось(должно вычислять все cleaner формы в конце области видимости)(оно полагается на порядок раскрытия слева-направо; соответственно, например, Clozure CL оно работает, а в SBCL, например - нет(и это только в случае с unwind-protect, как я понял. Если вместо него обычная функция, порядок - слева направо))