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

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

Ссылки