Topazdocs
Политика языка

Коллекции и включения

Каноническая грамматика, семантика, ограничения и отложенные границы: Коллекции и включения.

Array, Map, Set, literals, comprehensions, spread, indexing, membership, mutation, keyability, duplicates и iteration order заданы как наблюдаемая политика коллекций.

Политика

Array<T> — упорядоченная sequence, Map<K,V> — упорядоченная key/value collection, Set<T> — упорядоченная uniqueness collection. Spread в array literal принимает только Array. Контекстные set { ... } и map { key: value } вычисляют операнды слева направо. Comprehension начинается с for, принимает последующие for/if без запятых и финализирует private accumulator лишь после успеха всех достижимых body.

Определённое поведение

Array сохраняет production order. Равные элементы Set схлопываются в первый insertion slot. Динамически дублированный Map key даёт fault без overwrite после вычисления операндов; простой повтор literal key — статическая ошибка. Keys обязаны быть рекурсивно keyable и сохраняют nominal identity при freeze. Remove удаляет слот порядка, reinsertion добавляет в конец, update существующего Map value не меняет key order. in работает для Array, Set, range и map.keys, но не для самого Map.

Ограничения и явный отказ

Mutation требует mutable binding. Прямой отрицательный или выходящий за границы индекс Array даёт fault; безопасное чтение использует get. Отклоняются [T], x in map, non-keyable keys, spread Set/Map, iterable spread, leading if в comprehension, clauses с запятыми, bare control на comprehension и трактовка refutable mismatch как фильтра. Пустому Set/Map literal нужен expected type.

Отложенная граница

Общая user-defined iteration, lazy/parallel comprehensions, generators, tuple/iterable spread, другие duplicate policies и unordered semantics вне контракта. Строка не итерируется напрямую; скаляры обходятся явной операцией стандартной библиотеки.

Пример

TOPAZ
let squares = [ for value in [1, 2, 3] => value * value ]
let ids = set { for value in [2, 1, 2] => value }
let labels = map { for value in [1, 2] => value: "item {value}" }

print("{squares}:{ids.toArray()}:{labels.keys}")

Связанные правила