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

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

Приведение выполняется с контролем диапазона: если значение не помещается в целевой тип (сужение), возникает ошибка — как на этапе компиляции для известных значений, так и в рантайме для переменных. Молчаливого «обрезка»/переполнения нет.

Словарь как универсальный тип

Словарь — единственный тип, который может быть приведён к любому другому: для создания значения конкретного типа достаточно передать словарь аргументом в приведение/конструктор типа. Подробнее — в Словарях и наборах.

Преобразования между категориями

Правила и примеры преобразований для конкретных категорий описаны вместе с самими типами: