Topazdocs
Политика языка

Операторы и выражения

Каноническая грамматика, семантика, ограничения и отложенные границы: Операторы и выражения.

Topaz фиксирует приоритет, ассоциативность, числовые домены, допустимость сравнения, short-circuit и fault-поведение, чтобы форматирование и выбор бэкенда не меняли смысл выражения.

Политика

Приоритет идёт от постфиксных вызовов, индекса, member/optional access и распространения Result к правоассоциативному **, унарным + - !, умножению и сложению, диапазонам, сравнениям и in, затем &&, ||, ??, SPEC-композиции >> и левоассоциативному |>. Присваивания остаются инструкциями и не участвуют в таблице.

Определённое поведение

int — знаковый 64-битный two’s-complement: деление округляет к нулю, остаток наследует знак делимого, переполнение даёт fault, отрицательная целая степень запрещена. float — IEEE-754 binary64 с infinity и NaN. Бинарная арифметика не смешивает int и float неявно. && и || вычисляются слева направо с short-circuit; + складывает числа одного домена либо две строки.

Ограничения и явный отказ

Равенство разрешено только comparable-типам; функции, ресурсы, шаблоны, Map и Set несравнимы. Номинальное равенство сначала сохраняет identity enum/record/newtype. Деление целого на ноль, динамическое переполнение и отрицательная целая степень дают fault; в const-expression это статические ошибки. ++, --, **=, битовый ~ и общий оператор by отклоняются.

Отложенная граница

Неявные числовые преобразования, оператор остатка float, общие битовые операции, перегрузка и пользовательские операторы отсутствуют. >> определён в SPEC, но исключён public-docs профилем; канонические примеры используют именованные функции или |>.

Пример

TOPAZ
function score(base: int, bonus: int) -> int {
    let doubled = base * 2
    if bonus > 0 { doubled + bonus } else { doubled }
}

let result = score(20, 2)
print("{result}")

Связанные правила