Как временно определить условие внутри блока? - PullRequest
2 голосов
/ 27 мая 2019

В Common Lisp (в частности, SBCL в моем случае), обычно определяют исключения (известные как "условия"), используя define-condition макро.Это определяет условие глобально, в текущем пакете.

Есть ли способ определить условие локально в определенной области?Или, в качестве альтернативы, каким-то другим идиоматическим способом преждевременного выхода из области со значением без загрязнения глобального пространства имен?

(with-conditions
  (block
    (...)
    (prematurely-exit-block-with some-data)
    (...))
  (when-condition-happens (some data) ...))

1 Ответ

4 голосов
/ 28 мая 2019

Есть ли способ определить условие локально, в пределах определенной области?

Нет.

Или, альтернативно, какой-то другой идиоматический способпреждевременно выходить из области со значением, не загрязняя глобальное пространство имен?

Common Lisp имеет несколько конструкций для такого потока управления, в которых возвращается одно или несколько значений: RETURN, RETURN-FROM, THROW, ...

  • RETURN возврат из блока с именем NIL
  • RETURN-FROM возврат из именованного блока
  • THROW для перехода к тегу catch, установленному с помощью CATCH

return и return-from, используются лексические блоки.catch устанавливает динамическую область видимости для своего тега.

...