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

Материалы могут быть неполными или содержать ошибки. Содержимое сайта будет синхронизировано с реализацией при выходе следующей версии, тогда как текущая (0.6.0) предназначена для прототипирования синтаксиса и создания песочницы.

Словари и наборы (перечисления)

Действующие примеры с фактическим поведением текущей версии можно запустить в песочнице: словарь, словарь со смешанными типами, перечисление и вариант.

Словарь (:Dictionary)

Словарь — набор данных произвольного типа с доступом к элементам по целочисленному индексу или по имени элемента при его наличии (это похоже одновременно и на кортеж, и на структуру). Словарь всегда одномерный, но каждый элемент может содержать произвольное количество элементов любого типа, в том числе другие словари.

Литерал словаря записывается в круглых скобках с обязательной завершающей запятой: (,) — пустой словарь, (1, two='2', name=3,). Доступ к элементу — по имени через точку от имени переменной (d.name) либо по целочисленному индексу (d[0]), который начинается с 0 и может быть отрицательным (отсчёт от конца). Изменение — оператором []=; количество элементов — методом size().

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

Перечисление (:Enum)

Enum — тип с ограниченным списком членов, у каждого из которых есть имя и значение. Все члены имеют единый тип значений, который выводится по общим правилам — из явных значений членов либо из явной аннотации типа. Литерал-объявление записывается в постфиксной форме (члены,):Enum или префиксной :Enum(члены) (как у типизированного кортежа); завершающая запятая обязательна.

Status ::= (OK=0, ERROR=1, BUSY=2,):Enum;   # члены с явными значениями; тип значений Int64
Color ::= (RED, GREEN, BLUE,):Enum;          # безнарные члены — автоинкремент от 0
Flag  ::= (LOW:Int8, HIGH,):Enum;            # явный тип члена задаёт тип значений Int8

Если явных значений нет, тип значений — минимальный знаковый целый по числу членов; явная аннотация name:Type задаёт тип значений принудительно (у всех членов он должен быть одинаковым). Сравнение членов выполняется по значению, а не по позиции.

Обращение к члену — через имя типа: Status.OK. Классические методы (через имя типа): count() (число членов), fromName(name) (член по имени), fromValue(value) (член по значению).

Доступ к члену (Status.OK, Data.i) и методы count()/fromName()/fromValue() реализованы (пример — перечисление и вариант).

Вариант (:Variant)

Variant — гетерогенный тип: каждый член имеет свой тип данных (аналог std::variant). Тип члена задаётся явной аннотацией (name:Type) либо выводится из его значения; для безнарного члена без типа берётся минимальный знаковый целый по позиции.

Data ::= (i=42, s='text', r=1\2,):Variant;  # типы членов: Int8, StrChar, Rational
V    ::= (X:Int64=7, Y:Rational,):Variant;  # явные типы членов

Обращение к члену — через имя типа: Data.i (тип — тип конкретного члена). Классический метод: count() (число членов).