Выбор (CASE, IF, MULTI, OVERRIDE, EXCLUSIVE)
Оператор выбора создает свойство, которое для набора условий определяет, какое из этих условий выполняется, и возвращает значение соответствующего этому условию результата. Если ни одно из условий не выполняется, то значением создаваемого свойства будет NULL
.
Все условия и результаты задаются как некоторые свойства и/или параметры. Соответственно, условие выполняется, если значение свойства или параметра, с помощью которого задается это условие, не равно NULL
.
Полиморфная форма
Также в платформе существует возможность задавать условие и соответствующий ему результат одним свойством. В этом случае условием может являться либо принадлежность сигнатуре этого свойства, либо само это свойство. Такую форму оператора выбора будем называть полиморфной.
Отметим то, что оператор экстремума и логические операторы также по сути являются разновидностями оператора выбора (причем его полиморфной формой, то есть условия и результат определяются одним свойством)
Взаимоисключаемость условий
Для оператора выбора можно указать, что все его условия должны быть взаимоисключающими. Соответственно, если эта опция указана, а условия не являются взаимоисключающими, платформа выдаст соответствующую ошибку.
Стоит отметить, что такая проверка является не более чем подсказкой платформе (для лучшей оптимизации) и определенным самоконтролем со стороны разработчика. Однако, при этом использование такой проверки позволяет во многих случаях сделать код более прозрачным и читабельным (особенно в полиморфной форме оператора выбора).
Неявное задание
У этого оператора есть возможность неявного задания с помощью техники расширений, что позволяет, в частности, реализовывать полиморфизм в том виде, в котором это обычно принято делать в ООП.
Одиночная форма
Оператор выбора в одиночной форме проверяет ровно одно условие. Если это условие выполняется, возвращается значение указанного результата. Также в этой форме существует возможность указать альтернативный результат, значение которого будет возвращаться, если условие не выполняется.
Тип взаимоисключения и неявное задание для этой формы оператора не имеют смысла / не поддерживаются
Определение класса результата
Результирующим классом оператора выбора является общий предок его операндов (встроенный или пользовательский).
Язык
Для создания свойства, реализующего выбор в общем случае, используется оператор CASE
. Полиморфная форма оператора выбора реализуется при помощи операторов MULTI
, OVERRIDE
и EXCLUSIVE
, одиночная - при помощи операторов IF
и IF ... THEN
(только в этом операторе можно указывать альтернативный результат).
Примеры
CLASS Color;
id = DATA STRING[100] (Color);
background 'Цвет' (Color c) = CASE
WHEN id(c) == 'Black' THEN RGB(0,0,0)
WHEN id(c) == 'Red' THEN RGB(255,0,0)
WHEN id(c) == 'Green' THEN RGB(0,255,0)
;
id (TypeExecEnv type) = CASE EXCLUSIVE
WHEN type == TypeExecEnv.materialize THEN 3
WHEN type == TypeExecEnv.disablenestloop THEN 2
WHEN type == TypeExecEnv.none THEN 1
ELSE 0
;