Разделы сайта находятся в разработке.
Материалы могут быть неполными или содержать ошибки. Содержимое сайта будет синхронизировано с реализацией при выходе следующей версии, тогда как текущая (0.6.0) предназначена для прототипирования синтаксиса и создания песочницы.
Создание объектов и присваивание
Создание объектов
Для создания объектов в TrustLang используется несколько операторов:
-
“:=” — создаёт или присваивает значение переменной/функции (объекту по значению). Если объекта с таким именем ещё нет, он создаётся; иначе значение переприсваивается. Пример:
x := 5;,hello(str) := { ... };. -
“::=” — объявление типа (алиаса или типизированного типа), например
MyInt ::= :Int32;,Status ::= (OK=0, ERROR=1, BUSY=2,):Enum;. Применять “::=” для создания значений/функций нельзя — компилятор сообщает: “cannot assign a type … to a value variable; use ‘::=’ to declare a type alias”.Также через
::=объявляется предварительное (forward) объявление нативного класса:String ::= %std::string { %size(): UInt64 := ...; };— RHS — имя класса (native — с ведущим%), тело{ ... }— члены-интерфейс (методы/поля/конструкторы), каждый:= ...(без тела). Конструирование объекта — вызов имени класса:s: String := String('hello');→std::string("hello"). Подробнее — Нативные типы.
Операторы “::-” и “:-” в текущей версии не реализованы; ранее они предназначались для чистых функций и значений, вычисляемых на этапе компиляции.
Присвоение нового значения
Оператор “=” применяется для присвоения нового значения уже существующим объектам. Если объект с указанным именем отсутствует, то возникает ошибка компиляции.
Оператор обмена значениями
Оператор “:=:” (swap) не создает новых переменных, а только обменивает их значения между собой.
Переменные должны иметь одинаковые/совместимые типы данных, либо иметь тип :None, т. е. "_".
Используется для реализации идиомы копирования и замены (copy-and-swap idiom), так как при выполнении оператора не может быть ошибок.
В текущей реализации :=: — интринсик обмена/перемещения (используется как инструкция; результат
void): a :=: b раскрывается в std::swap(a, b) (типы должны быть совместимы, не обязательно
ссылки; обмен несовместимых типов — ошибка с диагностикой); форма var :=: _ — перемещение значения
в discard: перемещение выполняется РЕАЛЬНО (материализуется временное, которое сразу разрушается),
поэтому var остаётся в moved-from состоянии, а для владеющих ссылок (unique/shared) ресурс
освобождается.
См. также «Ссылочные типы».
Оператор добавления элемента
Оператор “[]=” — аналог push_back: добавляет новый элемент к контейнеру слева, увеличивая его размер на единицу.
Общее правило: X []= v равносильно X.push_back(v).
- Для словаря (
Dict, в т.ч. позиционные «массивы») безымянный append добавляет позиционный элемент:d []= 999. - Для строк добавляет символ/строку:
s []= 'd'→s.append("d"). - Правый объект оператора должен быть совместим с типом единичного элемента левого объекта
(ширина строки: узкая
'...'/ широкая"..."должны совпадать с типом строкового контейнера). - Вложенный LHS (
d['x'] []= v,d[0] []= v,d.field []= v) — пока не реализован (ошибка компиляции). - Слияние словаря через оператор распаковки
...:d []= ... dict2илиd []= ... (a=1, b=2,)добавляет в цель все элементы словаря-операнда (аналогextend/update); размер цели растёт на число элементов (для литерала и словаря с известным размером — статически контролируется).
d := (1, two=2,);
d []= 999; # добавить позиционный элемент → size 3
d []= 'x'; # добавить ещё один элемент
d []= ... (a=100, b=200,); # слияние литерала → size 5 (добавлены a и b)
d2 := (three=3, 4,);
d []= ... d2; # слияние переменной-словаря → size 7
s := 'abc';
s []= 'd'; # строка стала "abcd"
@print('{}', s); # > abcd
Добавление именованного элемента словаря выполняется оператором присваивания d[name] = value (установка/добавление по ключу).
Например, при определении класса :NewClass2:
:NewClass ::= :Class{ # Базовый класс
field1:Int32 := 1; # поле класса
field2:Int32 := 2; # поле класса
method1():Void := {}; # метод
};
:NewClass2 ::= :NewClass{ # наследование
field2:Int32 := 2; # поле field2 базового класса
method1():Void := {}; # переопределение метода (override)
};
$var := 99; # Создать временную переменную $var
{
$var := 100; # Новая переменная перекрывает $var более высокого уровня
@print('{}', $var) # > 100
}
@print('{}', $var) # > 99
Присваивание значения сразу нескольким переменным и оператор распаковки словаря
TrustLang поддерживает операцию присваивания значения сразу нескольким переменным, которые должны быть перечислены через запятую слева от оператора присвоения.
С правой стороны от оператора присвоения может находиться только одно значение,
а для обмена значениями двух переменных, вместо записи a,b = b,a;
нужно использовать оператор обмена:
a :=: b;
В качестве правого операнда в операторе присвоения допускается использовать оператор распаковки словаря … (многоточие), который можно использовать и при передаче аргументов в функцию.