Разделы сайта находятся в разработке.

Материалы могут быть неполными или содержать ошибки. Содержимое сайта будет синхронизировано с реализацией при выходе следующей версии, тогда как текущая (0.6.0) предназначена для прототипирования синтаксиса и создания песочницы.

Операторы

Арифметические операторы

Арифметические операторы TrustLang применимы к числовым типам и формам с присваиванием. Каждый бинарный оператор имеет парный аналог op=, который выполняет операцию и присваивает результат левому операнду (a += 1;):

Оператор Действие
+ / += сложение
- / -= вычитание
* / *= умножение (применимо и для повторения строк)
/ / /= деление (результат — число с плавающей точкой)
// / //= целочисленное деление с округлением к меньшему (как в Python)
% / %= остаток от целочисленного деления

Отдельного оператора возведения в степень нет (степень вычисляется функцией/повторным умножением). Арифметика рациональных чисел и :BigInteger — отдельная строгая ветка: смешивание с числами с плавающей точкой требует явного преобразования (см. Числа и тензоры).

Битовые (поразрядные) операторы

Записи .<. (сдвиг влево), .>./.>>. (сдвиг вправо), .&., .|., .^., .~. (И/ИЛИ/ИСКЛ-ИЛИ/НЕ) распознаются лексером и поддерживаются при SMT-верификации контрактов (транслируются в BV-операторы bvshl/bvashr/bvand/bvor/bvxor/bvnot). Генерация исполняемого C++-кода для них ещё не реализована (запланировано) — в .cppt оператор выводится как есть. Статус — в разделе Статус реализации.

Арифметическое сравнение

Операторы арифметического сравнения — классические <, >, <=, >=, ==, !=. Они применяются для сравнения скаляров и рациональных чисел; операторы равенства == и != позволяют сравнивать и составные значения.

Сравнение значений

  • == и != — сравнение с автоматическим приведением совместимых типов для любых объектов.
  • === и !== — точное сравнение для любых объектов (автоматического приведения не выполняется); для объектов сравниваются адреса размещения.

Сравнение типов

Операторы сравнения типов возвращают Bool и различаются строгостью проверки:

Оператор Смысл
<~ номинальная проверка: тип левого операнда совпадает с правым типом либо присутствует в его иерархии наследования
~~ утиная (структурная, нестрогая): у левого операнда присутствуют все поля образца правой части
~~~ строгая: номинальное тождество типа либо точное совпадение набора полей образца

Правый операнд — имя типа (:Class), строковый литерал с именем типа или словарь-образец ((field1=_, field2=0,); пустой словарь — (,)). Левый операнд — значение (проверяется его тип) или имя типа (:Base <~ :Derived).

dog <~ :Animal;             # тип dog — Animal или его наследник
dog ~~~ :Dog;               # точное тождество типа
:Dog <~ :Animal;            # Dog — подтип Animal (проверка на этапе компиляции)
:Animal <~ :Dog;            # ложь (обратное отношение — перестановкой операндов)
d ~~ (field1=_,);           # у d есть поле field1
d ~~~ (field1=_, field2=0,);# точный набор полей

Отрицаний у этих операторов нет — результат Bool проверяется как обычно: ветка else в if/match либо сравнение с false.

Статическая и динамическая проверка

  • Статика (основной путь): если тип левого операнда выведен на этапе компиляции, результат свёртывается в константу true/false (наследование — по реестру типов). Нулевая стоимость в генерируемом коде.
  • Динамика: проверки, требующие рантайм-типа значения (стёртые значения Any/элементы словаря с неизвестным типом), а также имя типа из строковой переменной, пока не реализованы — выдаётся явная диагностика компиляции.