Разделы сайта находятся в разработке.
Материалы могут быть неполными или содержать ошибки. Содержимое сайта будет синхронизировано с реализацией при выходе следующей версии, тогда как текущая (0.6.0) предназначена для прототипирования синтаксиса и создания песочницы.
Диапазоны, массивы и тензоры
Диапазоны, массивы и (в перспективе) тензоры — контейнерные (коллекционные) типы для работы с последовательностями и многомерными данными.
Диапазоны (:Range)
Диапазон — тип, приблизительный аналог «генератора» в Python: он поочерёдно выдает элементы в заданном
интервале с заданным шагом. В тексте диапазон указывается двумя или тремя элементами через две точки:
1..5 — от единицы до пяти с шагом по умолчанию 1; шаг задаётся третьим элементом: 0..10..2.
В качестве границ и шага можно использовать не только литералы, но и переменные, и рациональные
числа: 0.1..$stop..0.1 — от 0.1 до $stop с шагом 0.1; 0..100:Rational — диапазон рациональных чисел.
Массивы (:Array)
Одномерные массивы поддерживаются литералами [1, 2, 3,] (→ std::vector<Elem>), конструктором
:Array(...), доступом по индексу a[i] и методами массива (count, at, first, push_back, …).
Переменные с типом массива могут создаваться как по значению, так и как ссылочные.
Оставшиеся позиции массива можно дозаполнить оператором ... expr ... (последним элементом) —
размер берётся из размерного типа-цели: v:Int32[10] := [2, 3, ... 42 ...,]; (см.
Создание значений: заполнение тензоров).
Тензоры (:Tensor)
Тензоры — многомерные массивы (на базе LibTorch). В текущей версии многомерные массивы и полноценные
тензоры не реализованы (см. Статус) — реализован одномерный :Array и тип :Range.
Индексация
Доступ к элементам массива выполняется по целочисленному индексу, начиная с 0:
a := [10, 20, 30,];
x := a[0]; # 10
Отрицательные индексы (как в Python) не поддерживаются: обращение a[-1] вызывает рантайм-исключение.
Диапазоны в индексе (a[1..3]), значения :None и многоточие ... в индексе также пока не реализованы.
Перебор коллекций
Перебор элементов массива, диапазона или словаря выполняется циклом @while(коллекция) с
деструктуризацией текущего элемента (готовый пример — в
песочнице; подробнее — Циклы).
Стандартная библиотека предоставляет тип-итератор Iterator<T> — класс, помеченный @[borrowed].
Он отображается на C++ trust::AnyIterator<T> (устранённый единый курсор) и доступен без явного
импорта (загружается prelude; отключается --no-stdlib). Любая переменная типа Iterator<T>
автоматически зависима от исходного объекта: использование после мутации источника —
диагностика -Wborrowed (см. Контроль инвалидации ссылок). Атрибут
наследуется производными типами (Iterator<Int32> и др.).