Оценка выражения
Синтаксическая конструкция с помощью которой реализуется примерный аналог оператора switch или match выглядит следующим образом:
[ $var ] ==> {
[1] --> { code }; # Выполнится проверка условия $var == 1
[1, 2] --> { code }; # Выполнится проверка условия ($var == 1 || $var == 2)
[...] --> { code default }; # Ветка условия иначе
};
Или тоже самое, но с использованием макросов из модуля dsl:
@match( $var ) ==> {
@case( 1 ) { code };
@case( 1, 2 ) { code };
@default { code default };
};
Этот оператор очень похож на Pattern Matching, но все же не является сопоставлением с образцом, а скорее более краткая запись множественного оператора сравнения, так как в качестве оператора для оценки могут быть использован любые имеющиеся операторы сравнения на равенство:
- ==> — проверка на равенство с приведением типов;
- ===> — проверка на точное равенство;
- ~> — проверка типа (имени класса);
- ~~> — утиная типизация;
- ~~~> — строгая утиная типизация.
Но если в качестве оператора сравнения использовать оператор утиной типизации, то оценка выражения превращается в классический Pattern Matching:
$value := (f1=1, f2="2",);
@match( $value ) ~~> {
@case((f1=_, ), (f1=_, f2=0, )) { ... code ... }; # Поле f2 отсутствует или число
@case((f1=_, f2="",), (f1=_, f2='',)) { ... code ... }; # Поле f2 строка
@default { ... code default ... }; # Код по умолчанию
};