В этом разделе, мы расскажем об изменениях в терминологии, которая была
определена в разделе 1.2.4.
Условие
— это очень интересная ситуация в программе, которая была
обнаружена и объявлена. Позже мы также допустим, чтобы этот термин
также ссылался на объекты, которые программа использует в таких
ситуациях.
Ошибка
— это условие, при котором нормальное выполнение программы без
некоторых форм вмешательства (или пользовательского или программного,
это будет описано ниже) продолжаться не может.
Процесс, с помощью которого условие формально объявляется
программой, называется сигнализирование. Функция signal является
примитивным механизмом, с помощью которого это объявление и
производится. Другие абстракции, такие как error и cerror, разработаны на
основе signal.
В данном разделе используется следующая терминология
- Если сигнализирование условия или ошибки во всех случаях
является частью контракта функции, мы говорим, что она
«сигнализирует» или «должна сигнализировать» эту ошибку или
условие.
- Если сигнализирование условия или ошибка по некоторым важным
причинам
(например, производительность) является необязательным, мы
говорим, что программа «может сигнализировать» это условие или
ошибку. В этом случае, мы указываем, что во всех реализациях
операция запрещена, и допускаем что некоторые реализации могут
не проводить проверку этой ошибки.
- Если некоторое действие не определено, и оставлено на откуп
платформоспецифичным
расширениям, мы говорит «не определено», «непредсказуемо» или
«имеет неопределённый результат». Это означает, что обеспечить
переносимость программы, полагаясь на результат этого действия,
невозможно. Программа, которая попадает в неопределённую
ситуацию может вызвать отладчик, передать управление, или
непредсказуемо модифицировать данные.
- В некоторых случая, где не определено лишь возвращаемое
значение операции, но хорошо определены любые побочные
действия или передача управления, мы говорим «неопределённое
значение». В этом случае количество и природа возвращаемых
значений не определены, но можно с уверенностью ожидать
возврата из функции. Стоит отметить, что под это описание
попадают, некоторые (хотя и не много) законные способы,
в которых могут быть использованы такие возвращаемое(ые)
значение(я). Например, если функция foo не имеет побочных
эффектов и неопределённого значения, выражение (length (list
(foo))) полностью определено даже для переносимого кода. Тем
не менее, результат (print (list (foo))) не определён.