Разделы сайта находятся в разработке.
Материалы могут быть неполными или содержать ошибки. Содержимое сайта будет синхронизировано с реализацией при выходе следующей версии, тогда как текущая (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/элементы словаря с неизвестным типом), а также имя типа из строковой переменной, пока не реализованы — выдаётся явная диагностика компиляции.