(no subject)

Dec 17, 2009 20:47

А оговаривается ли где-то в стандарте порядок раскрытия макросов?
Репост отсюда вот:
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, как я понял. Если вместо него обычная функция, порядок - слева направо))
Previous post Next post
Up