Процедуры и процедуры-функции
Функция вывода сообщений об ошибках ERROR
При профессиональной подготовке процедур пользователь должен предусмотреть их поведение при возможных ошибках. Например, если он готовит процедуру или функцию, вычисляющую квадратный корень из действительных чисел, то надо учесть, что такой корень нельзя извлекать из отрицательных чисел (будем, исключительно в учебных целях, считать, что комплексные числа в данном примере недопустимы).
Для контроля за типом данных обычно используются различные функции оценки и тестирования. При выявлении ими ошибки, как правило, предусматривается вывод соответствующего сообщения. Для этого используется функция ERROR:
ERROR(expr_1 .expr_2….)
Где ехрr_1,… – ряд выражений (возможно, пустой). Наиболее часто ERROR выводит просто строковое сообщение об ошибке, например:
ERROR (`strings').
Полное сообщение об ошибке имеет вид:
Error, (in name) string….
Приведем пример процедуры, в которой предусмотрен вывод сообщения об ошибке при задании переменной х < 0:
> f: = ргос (х) if x<0 then error "invalid variable x: XI" .x else x*(l/2) end if end proc; f: = proc (x) if x < 0 then error "invalid variable x: %1" x else sqrt(x) end if end proc > f(3.): 1.732050808 > f(-3.); Error, (in f) invalid variable x: -3. > lasterror; "invalid variable x: %1" -3. > lastexception; f, "invalid variable x: %1", -3.
Эта процедура вычисляет квадратный корень из числа х. При х < 0 выводится заданное сообщение об ошибке. Еще раз обращаем внимание читателя на учебный характер данного примера,.поскольку вычисление квадратного корня (в том числе из комплексных и отрицательных действительных чисел) реализовано встроенной функцией sqrt.
Общая форма задания процедуры
Выше мы рассмотрели основные частные формы задания процедур. Все они могут быть объединены в общую форму задания процедуры:
name:-proc(<argseq>) # объявление процедуры local<nseq>; # объявление локальных переменных global<nseq>; # объявление глобальных переменных options<nseq>; # объявление расширяющих ключей description<stringseq>; # объявление комментарий <stateq> # выражения – тело процедуры end; (или end:) # объявление конца процедуры
Эта форма охватывает все описанные выше частные формы и позволяет готовить самые сложные и надежно работающие процедуры.