В соответствии с Динамическими нелокальными выходами секции Common Lisp the Language, 2-е издание ,
Промежуточные выходыпокинуты, как только начинается передача контроля;в случае броска это происходит в начале «второго прохода», упомянутого в примечании к реализации.Ошибка при попытке передачи управления на выход, динамический экстент которого закончился.
Однако в SBCL 1.3.4
:
(catch 'a
(catch 'b
(unwind-protect
(throw 'a "returning from protected")
(throw 'b "returning from unwind"))))
;; => "returning from unwind"
Это кажется неверным.Не следует ли завершить точку выхода 'b
между выполнением защищенной формы и формы очистки, что делает вышеуказанное незаконным?Пример гребли на лодке на той же странице предполагает то же самое.
Поведение SBCL вместо этого, кажется, соответствует альтернативному предложению:
... отказ от выходов должен быть сосредоточен нас оценкой unwind-protect
пунктов очистки и отменой динамических привязок и тегов перехвата, выполняющих все в обратном порядке создания.
Является ли это просто тем, что CLtL2 отличается от окончательной спецификации?