Topazdocs
Стандартная библиотека и среда

Базовая библиотека

Канонический API, поведение, доказательства и ограничения: Базовая библиотека.

Core floor фиксирует construction, conversion, доступ к скалярам текста, higher-order transforms, Option/Result helpers и profile-gated testing без скрытого coercion.

Канонический контракт

Prelude constructors: Some, None, Ok, Err; неразрешённым type variables нужен expected type. print принимает только string. toInt и conversion возвращают Option или объявленную ошибку, не exception. s.scalars() даёт строки из одного скаляра; у string нет .length. Free map, filter, reduce работают только с фиксированными iterable families.

Публичная поверхность

Inventory добавляет toIntRadix, fromCodePoint, toFloat, input, 13 Math members, string search/trim/split/slice/replace, Option okOr/okOrElse/map/flatMap, Result map/flatMap, неизменяемый Bytes, изменяемый ByteBuffer фиксированной длины, Encoding, hashes, форматы, Date, BigInt, Decimal и точные JSON decode heads.

Наблюдаемое поведение

String operations используют scalar semantics или явно названные byte semantics. Higher-order calls вычисляют inputs/callbacks в заданном порядке коллекции. Option.map и optional access сохраняют/уплощают Option; Result mapping не превращает fault в Err. Typed JSON требует один записанный полностью известный target и возвращает deterministic $-rooted path при data failure.

Сборка двоичных данных

Если алгоритму нужно записать много байтов в одно непрерывное значение фиксированной длины, используйте ByteBuffer.allocate(length, value = 0). Для set, fill и copy корневое связывание получателя должно быть объявлено через let mut. Индексы, диапазоны и значения байтов (0..255) проверяются до записи: ошибочная операция завершается fault и не оставляет частично изменённый буфер. Присваивание разделяет одно изменяемое значение, а ByteBuffer.fromBytes копирует данные в новый буфер и toBytes() создаёт неизменяемый снимок.

TOPAZ
let mut row = ByteBuffer.allocate(8)
row.fill(0, 8, 255)
row.set(0, 137)

let mut frame = ByteBuffer.allocate(12)
frame.copy(row, 0, 2, 8)
let payload = frame.toBytes()

Сам ByteBuffer нельзя передавать через Web export, сравнивать на равенство или порядок, использовать как ключ Map/Set, подставлять в строки или шаблоны либо кодировать в JSON. На текстовой границе или границе ABI создайте снимок Bytes и явно закодируйте его. Проверка выпуска измеряет пропускную способность в эталонной оптимизированной Web-среде, но порог для конкретной машины не гарантирует одинаковое время во всех браузерах и на всех устройствах.

Текущая поддержка

Основные имена проверяются статически, а виртуальный корень std предоставляет фиксированный набор модулей. Функции print и input доступны только в средах, которые предоставляют необходимый ввод и вывод.

Ограничения и исключения

Нельзя печатать non-string без interpolation, выводить unconstrained None/empty collection, считать string массивом, предполагать user Iterable, ловить fault Result-helper, decode recursive/open/imported schemas или публиковать test helpers. assert — функция только test-profile, не keyword.

Пример

TOPAZ
function parseAll(values: Array<string>) -> Array<Option<int>> {
    return map(values, value => toInt(value))
}

let scalars = "토파즈".scalars()
let parsed = parseAll(["1", "x", "3"])
print("{scalars.length}:{parsed}")

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