Динамические метки CATCH и нелокальный выход THROW

(catch метка ... form1 ... formn)

  1. Вычисляет форму метка.
  2. Устанавливает динамическую точку возврата с данной меткой.
  3. Оценивает формы, словно progn.

(throw метка результат)

  1. Вычисляет формы метка и результат.
  2. Ищёт самую динамически ближайшую точку возврата catch с той же меткой.
  3. Прекращает выполнение формы catch, возвращая из нее все значения результат.

Метки сравниваются с помощью eq.

Пример
(defun отжался (i)
  (format t " сделал ~d," i)
  (when (= i 3) 
    (throw 'Отжимания "устал"))
  "выполнил"))

(catch 'Отжимания
  (отжался 1) (отжался 2))
 сделал 1, сделал 2, "выполнил"

(catch 'Отжимания
  (отжался 1) (отжался 2) (отжался 3) (отжался 4))
 сделал 1, сделал 2, сделал 3, "устал"