Опционально перед выражением можно указать ``constexpr`` для вычисления во время компиляции.
Альтернативы имеют вид
> *условие* ``=`` *оператор* ``;``
где *условие* имеет следующий вид
> `` is`` *тип*
`` is`` *константа*
`` is (`` *выражение* ``)``
`` is (`` *предикат* ``)``
`` is _``
Последний вариант условия соответствует любому значению и должен быть самым последним. *предикат* означает имя функции, проверяющую аргумент на соответствие некоторому условию, или выражение, возвращающее такую функцию.
```c++
inspect n {
is 12 = std::println("дюжина");
is (even) = std::println("четное число");
is _ = std::println("неизвестное число");
}
```
``inspect`` можно использовать в выражении, как аналог операции ``? :``. В этом случае оператор выглядит так:
> `` inspect`` *выражение* ``->`` *тип* ``{`` *альтернативы* ``}``
где *альтернативы* имеют вид
> *условие* ``=`` *выражение* ``;``
```c++
// c=a>b?a:b;
c:=inspect a>b -> int {
is true = a;
is _ = b;
}
```
``next`` *выражение2* опционально. ``for`` является аналогом функции ``for_each`` и ``for`` для коллекции, а не обычного ``for``, поэтому в качестве *выражения1* нужно указать коллекции.
```c++
v:std::vector<int> = (7,1,9,-2);
// сортировка
flg:=false;
do {
i:=0;
while i<v.ssize()-1 next i++ {
if v[i]>v[i+1] {
std::swap(v[i],v[i+1]);
flg=true;
}
}
} while flg next flg=false;
// вывод
for v do (vi) {
std::cout<<vi<<"\n";
}
```
Если проверка *группы* включена и *условие* ложно, то программа завершается с сообщением об ошибке. *Флаги* и *сообщение* опциональны. *Группа* может принимать следующие значения: default, bounds_safety, null_safety, type_safety, testing из пространства имен cpp2, а также можно определить собственные группы. Группа default используется, если группа не указана. По умолчанию все группы включены, но можно выключать:
```
assert(2*2==4); //OK
cpp2::default.set_handler();
assert(2*2==5); // не проверяется
```