Операторы
Оператор определяет действие, которое предстоит выполнить; процесс реализации этого действия называется выполнением оператора.
В данной главе описываются общие правила, применимые ко всем операторам, и некоторые операторы. Оператор вызова процедуры описывается в гл. 6. Операторы вызова входа, задержки, принятия, отбора и прекращения описываются в гл. 9, оператор возбуждения — в гл. 11, а оператор кода — в гл. 13.
Ссылки: оператор возбуждения 11.3, оператор вызова входа 9.5, оператор вызова процедуры 6.4, оператор задержки 9.6, оператор кода 13.8, оператор отбора 9.7, оператор прекращения 9.10, оператор принятия
Операторы блока
Оператор блока содержит последовательность операторов, которой может предшествовать раздел описаний и за которой могут следовать обработчики исключений.
оператор-блока ::= [простое - имя - блока:] [declare раздел - описаний] beginпоследовательность-операторов [exception обработчик - исключения {обработчик - исключения}] end [простое- имя -блока];
Если в операторе блока используется простое имя блока, то оно должно задаваться как в начале, так и в конце.
Выполнение оператора блока заключается в предвыполнении раздела описаний (при его наличии) и последующем выполнении последовательности операторов. Если оператор блока содержит обработчики исключений, то они выполняются при возбуждении соответствующих исключений во время выполнения последовательности операторов (см. 11.2).
Пример:
SWAP: declare TEMP : INTEGER; begin TEMP := V; V := U; U :== TEMP; end SWAP;Примечание. Если в операторе блока, выполнение последовательности операторов которого окончено, описаны объекты задачного типа, то оператор блока не заканчивается до техпор, пока не будут завершены все его подчиненные задачи (см. 9.4). Это правило применяется также при окончании из-за выполнения операторов выхода, возврата или перехода или из-за возбуждения исключения.
Внутри оператора блока его имя может использоваться в расширенных именах локальных понятий, таких как в приведенном выше примере (см. 3, п. е).
Ссылки: возбуждение исключений 11, задачный объект 9.2, обработчик исключений 11.2, оператор возврата 5.8, оператор выхода 5.7, оператор перехода 5.9, подчиненная задача 9.4, последовательность операторов 5.1, простое имя 4.1, раздел описаний 3.9, расширенное имя 3.
Операторы цикла
Оператор цикла содержит последовательность операторов, выполнение которой повторяется несколько раз или ни одного раза. \
оператор-цикла ::= [простое-имя-цикла:] [схема-итерации] loop последовательность - операторов end loop [простое-имя-цикла]; схема-итерации ::= while условие | for спецификация-параметра-цикла спецификация-параметра-цикла ::= идентификатор in [reverse] дискретный-диапазонЕсли в операторе цикла используется простое имя цикла, то оно должно задаваться как в начале, так и в конце этого оператора.
Оператор цикла без схемы итерации определяет повторяемое выполнение последовательности операторов. Выполнение такого оператора цикла заканчивается выходом из цикла вследствие выполнения оператора выхода или какой-либо другой передачи управления (см. 5.1).
Для оператора цикла со схемой итерации while перед каждым выполнением последовательности операторов вычисляется условие; если значением условия является TRUE, то последовательность операторов выполняется, если FALSE, то выполнение оператора цикла заканчивается.
Для оператора цикла со схемой итерации for спецификация параметра цикла является описанием параметра цикла с заданным в схеме итерации идентификатором. Параметр цикла — это объект, типом которого является базовый тип дискретного диапазона (см. 1). В пределах последовательности операторов параметр цикла считается константой. Поэтому его использование в качестве переменной в левой части оператора присваивания недопустимо. Параметр цикла не должен использоваться в качестве параметра вида out или in out оператора вызова процедуры или входа, а также в качестве параметра вида in out конкретизации настройки.
Для выполнения оператора цикла с итерационной схемой for сначала предвыполняется спецификация параметра цикла. При этом создается параметр цикла и вычисляется дискретный диапазон.
Если дискретный диапазон пуст, то выполнение оператора цикла заканчивается. В противном случае последовательность операторов выполняется по одному разу для каждого значения из дискретного диапазона (при условии, что не происходит выхода из цикла из-за выполнения оператора выхода или какой-либо другой передачи управления). Перед каждой такой итерацией параметру цикла присваивается соответствующее значение из дискретного диапазона. При отсутствии зарезервированного слова reverse эти значения присваиваются в порядке возрастания, при наличии этого слова — в порядке убывания.
Пример оператора цикла без схемы итерации:
loop GET(CURRENT_CHARACTER); exit when CURRENT_CHARACTER = '*'; end loop;Пример оператора цикла со схемой итерации while:
while BID(N).PRICE < CUT_OFF.PRICE loop RECORD_BID(BID(N).PRICE); N := N + 1; end loop;Пример оператора цикла со схемой итерации for:
for J in BUFFER'RANGE loop -— правильно даже для пустого диапазона if BUFFER(J) /= SPACE then PUT(BUFFER(J)); end if; end loop;Пример оператора цикла с простым именем цикла:
SUMMATION: while NEXT /= HEAD loop -— CM. 3.8 SUM := SUM + NEXT.VALUE; NEXT := NEXT.SUCC; end loop SUMMATION;Примечание. Область действия параметра цикла простирается от спецификации параметра цикла до конца оператора цикла, а правила видимости таковы, что параметр цикла видим только в пределах последовательности операторов в цикле.
Дискретный диапазон цикла вычисляется только один раз. Использование зарезервированного слова reverse не изменяет дискретный диапазон, так что следующие схемы итерации не эквивалентны (в первой — диапазон пуст):
for J in reverse 1 .. 0 for J in 0 .. 1Имена циклов используются также в операторах выхода и в расширенных именах (в качестве префикса имени параметра цикла).
Ссылки: альтернатива завершения 1, базовый тип 3.3, видимость 8.3, возбуждение исключений 11, вызов процедуры 6.4, вычисление 4.5, граница диапазона 3.5, дискретный диапазон 1, зарезервированное слово 2.9, идентификатор 2.3, конкретизация настройки 12.3, константа 1, контекст разрешения совмещения 8.7, логическое значение FALSE 3, логическое значение TRUE 3, область действия 8.2, объект 3.2, оператор возврата 5.8, оператор вызова входа 9.5, оператор выхода 5.7, оператор перехода 5.9, оператор присваивания 5.2, описание 3.1, последовательность операторов 5.1, пред'выполнение 3.1, преобразование 4.6, префикс 4.1, простое имя 4.1, пустой диапазон 3.5, расширенное имя 3, условие 5.3, фактический параметр 1, фактический параметр настройки 12.3, целый тип 4.
Операторы перехода
Оператор перехода определяет явную передачу управления на помеченный меткой оператор.
оператор перехода ::= goto имя-метки;Самая вложенная последовательность .операторов, объемлющая помеченный меткой оператор, должна также охватывать и оператор перехода на эту метку (в частности, оператор перехода может входить в еще более вложенную последовательность операторов). Кроме того, если оператор перехода содержится в операторе принятия или теле программного модуля, то соответствующий помеченный оператор не должен быть вне этой конструкции, и, наоборот (как следует из предыдущего правила), если помеченный оператор содержится в такой конструкции, то оператор перехода не может быть вне ее.
Выполнение оператора перехода заключается в передаче управления на помеченный соответствующей меткой оператор.
Примечание. Приведенные выше правила допускают передачу управления на оператор из некоторой объемлющей последовательности операторов, но не наоборот. Аналогично они запрещают передачу управления между альтернативами оператора выбора, условного оператора или оператора отбора, между обработчиками исключений или из обработчика исключения некоторого окружения обратно на последовательность операторов этого окружения.
Пример:
<<COMPARE>> if A(l) < ELEMENT then if LEFT(I) /= 0 then I := LEFT(t); goto COMPARE; end if; -- некоторые операторы end if;Ссылки: метка 5.1, настраиваемое тело 12.1, обработчик исключения 11.2, окружение 11.2, оператор 5.1, оператор блока 5.6, оператор выбора 5.4, оператор отбора 9.7, оператор принятия 9.5, передача управления 5.1, последовательность операторов 5.1, программный модуль 6, составной оператор 5.1, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, условный оператор
Операторы присваивания
Оператор присваивания заменяет текущее значение переменной новым значением, задаваемым выражением. Переменная в левой части оператора присваивания и выражение в его правой части должны быть одного и того же типа, однако он не должен быть лимитируемым.
оператор-присваивания ::= имя-переменной := выражение;
При выполнении оператора присваивания вначале вычисляются имя переменной и выражение в порядке, не определенном в языке. Затем, если переменная не является массивом, проверяется принадлежность значения выражения подтипу переменной (если же переменная — массив, то при присваивании производится преобразование подтипа, как описано в разд. 1). Наконец, значение выражения становится новым значением переменной.
При отрицательном результате упомянутой выше проверки принадлежности подтипу возбуждается исключение CONSTRAINT_ERROR, а текущее значение переменной не изменяется. Выполнение присваивания ошибочно, если переменная является подкомпонентой, зависящей от дискриминантов неограниченной именуемой переменной, и при этом выполнении изменяется значение любого из упомянутых дискриминантов.
Операторы возврата
Оператор возврата используется для окончания выполнения самой внутренней объемлющей конструкции, которая может быть функцией, процедурой или оператором принятия.
оператор-возврата ::= return [выражение];
Оператор возврата допустим только в теле подпрограммы или настраиваемой подпрограммы или в операторе принятия и применяется к самой внутренней (объемлющей его) такой конструкции; оператор возврата недопустим в теле модуля-задачи, пакета или настраиваемого пакета, объемлемого одной из указанных конструкций (с другой стороны, он допустим в составном операторе, вложенном в такую конструкцию, и в частности в операторе блока).
Оператор возврата в операторе принятия, в теле процедуры или настраиваемой процедуры не должен содержать выражения. Оператор возврата в теле функции или настраиваемой функции должен содержать выражение.
Значение выражения определяет результат, возвращаемый функцией. Тип этого выражения должен быть базовым для обозначения типа, приводимого после зарезервированного слова return в спецификации функции или настраиваемой функции (это обозначение типа определяет подтип результата).
Для выполнения оператора возврата сначала вычисляется выражение (при его наличии) и проверяется принадлежность его значения подтипу результата. При положительном итоге проверки заканчивается вычисление оператора возврата и одновременно подпрограммы или оператора принятия, при отрицательном — в месте оператора возврата возбуждается исключение CONSTRAINT_ERROR.
Операторы выбора
Оператор выбора выбирает для выполнения одну из нескольких альтернативных последовательностей операторов; выбор альтернативы осуществляется в зависимости от значения выражения.
оператор-выбора ::= case выражение is альтернатива-оператора-выбора {альтернатива - оператора - выбора} end case;альтернатива-оператора-выбора :: = when выбор { | выбор } => последовательность-операторовВыражение должно быть дискретного типа, который должен быть определимым независимо от контекста выражения, но с учетом того факта, что тип выражения должен быть дискретным. Более того, тип этого выражения не должен быть настраиваемым формальным ти-
пом. Каждый выбор в альтернативе оператора выбора должен быть того же типа, что и выражение; перечень выборов определяет, для каких значений выражения выбирается соответствующая альтернатива.
Если выражение является именем объекта статического подтипа, то каждое значение этого подтипа должно быть представлено один и только один раз в наборе выборов оператора выбора и никакие другие значения недопустимы; это правило применяется также, если выражение является квалифицированным выражением или преобразованием типа, обозначение типа которого указывает статический подтип. В остальных случаях, для других форм выражения, каждое значение (базового) типа выражения должно быть представлено только один раз в наборе выборов и никакие другие значения недопустимы.
Используемые в качестве выборов в операторе выбора простые выражения и дискретные диапазоны должны быть статическими. Выбор, являющийся дискретным диапазоном, задает все значения из этого диапазона (ни одного значения в случае пустого диапазона). Выбор others допустим только в качестве единственного выбора для последней альтернативы и задает все значения (возможно, и ни одного), не приведенные в выборах предыдущих альтернатив. В качестве выбора в альтернативе оператора выбора не допускается использование простого имени компоненты.
Выполнение оператора выбора заключается в вычислении выражения, в выборе последовательности операторов и в выполнении выбранной последовательности операторов.
Операторы выхода
Оператор выхода используется для окончания выполнения объемлющего оператора цикла (называемого в дальнейшем просто циклом); окончание может быть условным, если оператор выхода содержит условие.
оператор-выхода ::= exit [ имя-цикла][ when условие];Оператор выхода с именем цикла допустим только в именованном цикле и приманив юя к этому циклу; оператор выхода без имени цикла допускается в некотором цикле и применяется к самому внутреннему объемлющему циклу (именованному или нет). Кроме этого, применяемый к конкретному циклу оператор выхода не должен появляться в теле подпрограммы, теле пакета, теле задачи, в настраиваемом теле или в операторе принятия, если эта конструкция вложена в рассматриваемый цикл.
Для выполнения оператора выхода сначала вычисляется условие, если оно есть. Выход из цикла происходит, если значением условия является TRUE или условие отсутствует.
Значения дискриминантов объекта, указанного ссылочным
Примечание
VALUE := MAX_VALUE - 1; SHADE := BLUE;NEXT_FRAME(F)(M, N) := 2.5; --CM. 1 U := DOT_PRODUCT(V, W); -- CM. 6.5WRITER := (STATUS => OPEN, UNIT => PRINTER, LINE_COUNT => 60); -- CM. 3 NEXT_CAR.all := (72074, null); -- CM. 1 Примеры проверок ограничений:
I,J : INTEGER range 1 ..10; К : INTEGER range 1 ..20;I := J; --одинаковые диапазоны К := J; -- совместимые диапазоны J := К; -- при К<10 возбудится исключение CONSTRAINT_ERROR Примечание. Значения дискриминантов объекта, указанного ссылочным значением, не могут быть изменены (даже присваиванием составного значения всему объекту), поскольку такие объекты, созданные генераторами, всегда являются ограниченными (см. 4.8); подкомпоненты таких объектов могут и не быть ограниченными.
Если выражение в правой части является числовым литералом, именованным числом или атрибутом, вырабатывающим результат типа универсальный-целый или универсальный-вещественный, то производится неявное преобразование типа, описанное в разд.
Определение типа переменной в левой части оператора присваивания может потребовать рассмотрения выражения, если имя переменной может интерпретироваться как имя переменной, указанной ссылочным значением, возвращаемым вызовом функции, а также как компонента или отрезок такой переменной (см. разд. 8.7 о контексте разрешения совмещения).
Ссылки: вызов функции 6.4, выражение 4.4, вычисление 4.5, генератор 4.8, дискриминант 1, имя 4.1, исключение CONSTRAINT_ERROR 11.1, компонента 3.6, 3.7, массив 3.6, неявное преобразование типа 4.6, объект 3.2, отрезок 2, ошибочный 1.6, переменная 1, подкомпонента 3.3, подтип 3.3, преобразование подтипа 4.6, присваивание массива 1, совмещение 6.6, 8.7, ссылочный тип 3.8, тип 3.3, указывать 3.8, универсальный-вещественный тип 6, универсальный-целый тип 4, числовой литерал
1. ПРИСВАИВАНИЯ МАССИВОВ
Если переменная в левой части оператора присваивания является индексируемой (в частности, отрезком), значение выражения неявно преобразуется в значение подтипа индексируемой переменной, после чего результат преобразования становится новым значением переменной.
Это значит, что новое значение каждой компоненты индексируемой переменной задается сопоставляемой ей компонентой индексируемого значения, полученного при вычислении выражения (см. определение сопоставляемых компонент в 2). При преобразовании подтипа для каждой компоненты индексируемой переменной проверяется наличие сопоставляемой компоненты индексируемого значения, и наоборот. При отрицательном результате этой проверки возбуждается исключение CONSTRAINT_ERROR, а значение каждой компоненты переменной не изменяется.
в случае перекрывающихся отрезков, поскольку
Примечание
А : STRING(1 .. 31); В : STRING(3 .. 33); ... А := B; — одинаковое количество компонентА(1 .. 9) := "tar sauce"; А(4 .. 12) := A(1 .. 9); -- А(1 .. 12) = "tartar Sauce" Примечание. Присваивание массива определено даже в случае перекрывающихся отрезков, поскольку выражение в правой части вычисляется До присваивания компонент. Так, в случае последнего из приведенных примеров реализация, вырабатывающая А(1 .. 12) = = "tartartartar", была бы некорректной^.
Описанное выше явное преобразование подтипа выполняется только на уровне значения всего выражения правой части, но не для его подкомпонент, являющихся индексируемыми значениями.
Ссылки: исключение CONSTRAINT_ERROR 11.1, массив 3.6, отрезок 2, переменная 1, преобразование подтипа 4.6, присваивание 5.2, сопоставляемые индексируемые компоненты 2, тип
1) Покомпонентная пересылка недопустима. — Прим. ред.
логический тип 3, последовательность операторов
Примечание
if MONTH = DECEMBER and DAY = 31 then MONTH := JANUARY; DAY := 1; YEAR := YEAR + 1; end if;if LINE-JOO-SHORT then raise LAYOUT-ERROR; elsif LINEFULL then NEW-LINE; PUT(ITEM); else PUT(ITEM); end if;if MY-.CAR.OWNER.VEHICLE /= MY-.CAR then -- CM. 1 REPORT ("Incorrect data"); end if; Ссылки: выражение 4.4, выполнение 4.5, логический тип 3, последовательность операторов
При выполнении оператора выбора выбирается
Примечание
case SENSOR is when ELEVATION => RECORDELEVATION (SENSOR-VALUE); when AZIMUTH => RECORD.AZIMUTH (SENSOR-VALUE); when DISTANCE => RECORD-DISTANCE (SENSOR-VALUE); when others => null; end case;case TODAY is when MON => COMPUTE-INITIAL-BALANCE; when FRI => COMPUTE-CLOSING-BALANCE; when TUE .. THU => GENERATEREPORT(T-ODAY); when SAT .. SUN => null; end case;case BIN_NUMBER(COUNT) is when 1 => UPDATE_BIN(1); when 2 => UPDATE_BIN(2); when 3 | 4 => EMPTY_BIN(1); EMPTY_BIN(2); when others => raise ERROR; end case; Примечание. При выполнении оператора выбора выбирается одна и только одна альтернатива, так как выборы являются исчерпывающими и взаимно исключающими. Квалификацией выражения в операторе выбора статическим подтипом можно ограничить количество выборов, которые необходимо указать явно.
Выбор others обязателен в операторе выбора, если выражение имеет тип универсальный-целый (например, выражение является целым литералом), так как это единственный способ учесть все значения типа универсальный-целый.
Ссылки: базовый тип 3.3, выбор 3, вызов функции 6.4, выражение 4.4, дискретный тип 3.5, имя 4.1, квалифицированное выражение 4.7, контекст разрешения совмещения 8.7, литерал перечисления 1, обозначение типа 2, объект 1, последовательность операторов 5.1, преобразование 4.6, преобразование типа 4.6, подтип 3.3, совмещение 6.6, 8.7, статический дискретный диапазон 4.9, статический подтип 4.9, тип 3.3, формальный тип настройки
Выход из нескольких вложенных циклов
Примечание
for N in 1 .. MAXJMUMJTEMS loop GET_NEW_ITEM(NEW_ITEM); MERGE_ITEM(NEW_ITEM, STORAGE_FILE); exit when NEW_ITEM = TERMINAL_ITEM; end loop;MAIN_CYCLE: loop -- начальные операторы exit MAINCYCLE when FOUND; -- заключительные операторы end loop MAINCYCLE; Примечание. Выход из нескольких вложенных циклов можно осуществить с помощью оператора выхода с именем внешнего цикла.
Ссылки: вычисление 4.5, имя цикла 5.5, логическое значение 3, настраиваемое тело 12.1, оператор принятия 9.5, оператор цикла 5.5, тело пакета 7.1, тело подпрограммы 6.3, условие
Если выражение является числовым литералом,
Примечание
return; -- в процедуре return KEY_VALUE(LAST_INDEX); -- в функции Примечание. Если выражение является числовым литералом, именованным числом или атрибутом, который вырабатывает результат типа универсальный-целый или универсальный-вещественный, то выполняется неявное преобразование результата, как описано в разд.
Ссыпки: атрибут А, вызов функции 6.4, выражение 4.4, именованное число 3.2, зарезервированное слово 2.9, исключение CONSTRAINT_ERROR 11.1, модуль-задача 9.1, настраиваемое тело 12.1, неявное преобразование типа 4.6, обозначение типа 2, оператор блока 5.6, оператор принятия 9.5, подтип 3.3, подтип результата 6.1, спецификация подпрограммы 6.1, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, тело процедуры 6.3, тело функции 6.3, универсальный вещественный тип 6, универсальный целый тип 4, числовой литерал
Простые и составные операторы. Последовательности операторов
Оператор может быть или простым, или составным. Простой оператор не содержит других операторов. Составной оператор содержит простые операторы и другие составные операторы.
последовательность-операторов ::= оператор (оператор) оператор ::= {метка} простой-оператор | {метка} составной-оператор простой-оператор ::= пустой-оператор | оператор-присваивания | оператор-вызова-процедуры | оператор-выхода | оператор-возврата | оператор-перехода | оператор-вызова-входа | оператор-задержки | оператор-прекращения | оператор-возбуждения | оператор-кодасоставной-оператор ::= условный-оператор | оператор-выбора | оператор-цикла | оператор-блока | оператор-принятия | оператор-отбораметка ::= << простое-имя-метки >> пустой-оператор ::= null:Говорят, что имя каждой метки, стоящей перед оператором, помечает этот оператор. Имя метки (а также имя цикла или блока) неявно описано в конце раздела описаний самого внутреннего блока, тела подпрограммы, тела пакета, тела задачи или настраиваемого тела, которые содержат данный помеченный оператор (именованный оператор цикла или именованный оператор блока). При отсутствии в операторе блока раздела описаний подразумевается, что оператор блока содержит неявный раздел описаний (с предшествующим declare ).
Имена меток, циклов и блоков неявно описываются в порядке появления в тексте программы начал соответствующих помеченных операторов, операторов цикла и операторов блока. Для имен меток, циклов и блоков, неявно описанных в теле программного модуля, включая вложенные в это тело операторы блока, но исключая другие вложенные программные модули (т. е. подпрограммы, пакеты, задачи или настраиваемые модули), должны использоваться различные идентификаторы.
Выполнение пустого оператора заключается в переходе к выполнению следующего оператора.
Выполнение последовательности операторов состоит в поочередном выполнении отдельных операторов последовательности, пока они все не будут закончены или пока не произойдет передача управления. Передача управления вызывается выполнением операторов выхода, возврата или перехода, выбором альтернативы завершения, возбуждением исключения или (неявно) выполнением оператора прекращения.
Примеры помеченных операторов:
<<HERE>> <<ICI>> <<AQUI>> <<HIER>> null;
<<AFTER>> X := 1;
Примечание. Область действия описания начинается самим описанием (см. 8.2). Область действия неявного описания имени метки, цикла или блока начинается до первого явного появления соответствующего имени, поскольку это появление возможно лишь в качестве метки оператора, в операторе блока, операторе цикла или операторе перехода. Неявное описание в операторе блока может скрыть описание, данное во внешнем программном модуле или операторе блока (согласно обычным правилам скрытия, изложенным в разд. 8.3).
Ссылки: альтернатива завершения 1, возбуждение исключений 11, завершенная задача 9.4, задача 9, задачный модуль 9.1, идентификатор 2.3, имя блока 5.6, имя цикла 5.5, исключение 11, настраиваемое тело 12.1, настраиваемый модуль 12, неявное описание 3.1, область действия 8.2, оператор блока 5.6, оператор возбуждения 11.3, оператор возврата 5.8, оператор выбора 5.4, оператор вызова входа 9.5, оператор вызова процедуры 6.4, оператор выхода 5.7, оператор задержки 9.6, оператор кода 13.8, оператор отбора 9.7, оператор перехода 5.9, оператор прекращения 9.10, оператор принятия 9.5, оператор, присваивания 5.2, оператор цикла 5.5, описание 3.1, пакет 7, подпрограмма 6, программный модуль 6, простое имя 4.1, раздел описаний 3.9, скрытие 8.3, тело задачи 9.1, тело пакета 7.1, тело подпрограммы 6.3, условный оператор
Условные операторы
Условный оператор выбирает для выполнения одну или ни одной из входящих в него последовательностей операторов в зависимости от значения (истинности) одного или нескольких условий.
условный-оператор ::= if условие then последовательность - операторов | elsif условие then последовательность-операторов) [else последовательность - операторов] end if; условие ::= логическое-выражениеВыражение, задающее условие, должно быть логического типа.
Для выполнения условного оператора вычисляются последовательно условия после if и elsif (трактуя заключительное else как elsif TRUE then ) до тех пор, пока одно из них не окажется истинным или не будут исчерпаны все условия. При нахождении условия со значением TRUE выполняется соответствующая последовательность операторов, в противном случае не выполняется ни одна из последовательностей операторов.