1.5.1. НЕУСПЕХ ПРИ ВЫЧИСЛЕНИИ РЕЗУЛЬТАТНЫХ ВЫРАЖЕНИЙ И ТРОП

До сих пор мы считали, что результатом вычисления тропы Q является некоторое объектное выражение Oe. В действительности, однако, это вычисление может закончиться неуспехом или аварией. В случае неуспеха результатом вычисления является особое значение, "неуспех", которое не является объектным выражением. Простейший способ породить неуспех - это вычислить хвост вида

$fail

В случае аварии результатом вычисления является особое значение, которое не является объектным выражением и имеет вид $error(Oe), где Oe - некоторое объектное выражение, которое является сообщением об ошибке. Обычно Oe начинается с символа-слова, являющегося именем функции, во время работы которой возникла авария. Например, если мы попытаемся вычислить вызов функции

<DIV 10 0>

возникнет авария "деление на ноль", а результатом вычисления этого вызова будет

$error(DIV "Divide by zero")

Значения вида $error(Oe) обладают следующим свойством. Пусть нам требуется вычислить некоторую конструкцию. Тогда, если при вычислении некоторой составной части этой конструкции получается результат $error(Oe),дальнейшее вычисление конструкции прекращается и результатом вычисления всей конструкции считается $error(Oe). Единственным исключением из этого правила является конструкция $trap, специально предназначенная для "перехвата" аварий. Все тонкости, связанные с обработкой аварий, подробно описаны в главах 2 и 3, поэтому, чтобы не загромождать изложение, в данной главе мы будем их по возможности опускать.