Перейти к основному содержимому
Версия: 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); } }