Перейти к основному содержимому
Версия: 7.0

Ветвление (CASE, IF, MULTI)

Оператор ветвления создает действие, которое для набора условий определяет, какое из этих условий выполняется, и вызывает соответствующее этому условию действие.

Все условия задаются как некоторые свойства и / или параметры. Соответственно, условие выполняется, если значение свойства или параметра, с помощью которого задается условие, не равно NULL.

Условия проверяются в порядке записи; первое выполнившееся условие задает вызываемое действие, остальные условия не проверяются. Также можно указать альтернативное действие, которое вызывается только если ни одно из условий не выполнилось.

Сигналы прерывания, следующей итерации и выхода, сформированные вызванным действием, передаются окружающему действию — сам оператор ветвления их не поглощает.

Полиморфная форма

Также в этом операторе существует возможность не задавать условие явно — условием является принадлежность аргументов классам параметров соответствующего этому условию действия. Такую форму оператора выбора будем называть полиморфной. Полиморфная форма — естественный способ диспетчеризации по классу аргумента.

Взаимоисключаемость условий

Для оператора ветвления можно указать, что все его условия должны быть взаимоисключающими. Соответственно, если эта опция указана, а условия не являются взаимоисключающими, платформа выдаст соответствующую ошибку.

Общая форма по умолчанию не взаимоисключающая и может быть помечена как взаимоисключающая явно. Полиморфная форма взаимоисключающая по умолчанию — реализации для непересекающихся классов аргументов не перекрываются. Одиночная форма имеет ровно одно условие и взаимоисключения не использует.

Неявное задание

Общая и полиморфная формы поддерживают неявное задание с помощью техники расширений. Одиночная форма имеет одно фиксированное условие и неявное задание не поддерживает.

Одиночная форма

Оператор ветвления в одиночной форме проверяет ровно одно условие. Если это условие выполняется, то вызывается указанное действие. Также существует возможность указать альтернативное действие, которое будет вызвано, если условие не выполняется.

Язык

Для объявления действия, реализующего ветвление в общем случае, используется оператор CASE. Для ветвления в одиночной форме используется оператор IF, в полиморфной - оператор MULTI.

Примеры

test = DATA INTEGER (INTEGER);
caseActionTest(a) {
CASE
WHEN test(a) > 7 THEN MESSAGE '>7';
WHEN test(a) > 6 THEN MESSAGE '>6';
WHEN test(a) > 5 THEN MESSAGE '>5';
}
// Действие, сравнивающее значение свойства count с числом 3 и выдающее пользователю сообщение
moreThan3(obj) {
IF count(obj) > 3 THEN
MESSAGE '>3';
ELSE
MESSAGE '<=3';
}

checkNullName (Store st) {
IF NOT name(st) THEN
MESSAGE 'Name is null';
}
CLASS Shape;

CLASS Square : Shape;
CLASS Circle : Shape;

message (Square s) { MESSAGE 'Square'; }
message (Circle c) { MESSAGE 'Circle'; }

message (Shape s) = MULTI message[Square](s), message[Circle](s);