Разделы сайта находятся в разработке.
Материалы могут быть неполными или содержать ошибки. Содержимое сайта будет синхронизировано с реализацией при выходе следующей версии, тогда как текущая (0.6.0) предназначена для прототипирования синтаксиса и создания песочницы.
Система типов
Принципы
TrustLang имеет закрытую систему типов: любой новый тип данных обязательно наследует
(расширяет) один из уже существующих. Это напоминает модель Object в Java, но без физического наследования (без боксинга простых типов в объекты).
Этот подход является основой для обобщённого программирования, когда производный тип наследует набор операций «родительского» типа,
и продолжает работать со всеми его наследниками.
Язык динамически типизирован: тип переменной можно указать явно или оставить автоматический вывод. Указанный тип используется для проверок совместимости при присваивании, для проверки типа возвращаемого значения функции и для управления размещением в памяти нативных типов. Автоматическое приведение возможно только между совместимыми типами; в остальных случаях требуется явное преобразование типов.
Категории типов
Типы данных разделяются на простые (скалярные, не расширяемые) и составные (контейнерные и определяемые пользователем). Кратко по категориям (подробности — на соответствующих страницах раздела):
| Категория | Типы | Описание на странице |
|---|---|---|
| Целые | :Int8…:Int64, беззнаковые синонимы (:Byte, :Word, :DWord), :Bool |
Числа и тензоры |
| Числа с плавающей точкой | :Float16, :Float32, :Float64 |
Числа и тензоры |
| Произвольная точность | рациональные m\n и :BigInteger (GMP) |
Числа и тензоры |
| Строки | :StrChar (UTF-8), :StrWide |
Символьные строки |
| Диапазоны и массивы | :Range, :Array (одномерный, std::vector) |
Диапазоны, массивы и тензоры |
| Словари | :Dictionary (позиционные и именованные элементы) |
Словари и наборы |
| Пользовательские | перечисления :Enum, варианты :Variant, кортежи :Tuple, алиасы ::= |
Словари и наборы |
| Нативные | импорт и предварительное объявление C/C++-типов и шаблонов | Нативные типы |
Переменные могут хранить значение напрямую либо быть ссылочными (сильные/слабые ссылки,
shared/weak) — см. Управление памятью.
Имена типов и конструкторы
Каждый тип имеет краткое имя, начинающееся с двоеточия (например, :Int32), и одноимённую
функцию-конструктор без двоеточия. Новый экземпляр создаётся вызовом конструктора: x := Int32(5);.
Типы могут быть синонимами — два типа с одинаковым кратким именем в разных пространствах имён;
в этом случае требуется явная квалификация имени при вызове конструктора (см.
Именование объектов).
Статус реализации
Из «объектно-ориентированных» возможностей реализованы базовые :Struct/:Class (поля, методы,
наследование), типы Enum/Variant/Tuple и предварительное объявление нативных классов
(см. Классы). Комплексные числа (:Complex16/32/64), многомерные тензоры (полноценные
:Tensor), виртуальные методы/@[override] (полноценное ООП), корутины и чистые функции не
реализованы — подробнее в Статусе реализации и ограничения.
Преобразование типов
Несмотря на динамическую типизацию, если тип переменной указан явно, автоматическое приведение типов не выполняется — для присваивания значения несовместимого типа требуется его явное преобразование.
Явное приведение вызовом типа
Явное преобразование выполняется вызовом функции с именем целевого типа (кратким именем без
двоеточия): :Int32(x) читается как Int32(x) — это вызов конструктора/приведения типа.
n := Int32(3.14); # число с плавающей точкой → целое
b := Bool(5); # число → логическое (0/1)
f := Float64(n); # целое → число с плавающей точкой
Приведение выполняется с контролем диапазона: если значение не помещается в целевой тип (сужение), возникает ошибка — как на этапе компиляции для известных значений, так и в рантайме для переменных. Молчаливого «обрезка»/переполнения нет.
Словарь как универсальный тип
Словарь — единственный тип, который может быть приведён к любому другому: для создания значения конкретного типа достаточно передать словарь аргументом в приведение/конструктор типа. Подробнее — в Словарях и наборах.
Преобразования между категориями
Правила и примеры преобразований для конкретных категорий описаны вместе с самими типами:
- числа и рациональные значения — Числа и тензоры;
- строки и их форматирование — Символьные строки;
- диапазоны/массивы и изменение размерности — Диапазоны, массивы и тензоры;
- нативные C/C++-типы — Нативные типы.