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