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

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

В качестве правого операнда в операторе присвоения допускается использовать оператор распаковки словаря … (многоточие), который можно использовать и при передаче аргументов в функцию.