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-среде, но порог для конкретной машины не гарантирует одинаковое время во всех браузерах и на всех устройствах.

Контроль целостности CRC-32

Hash.crc32(data) возвращает беззнаковое значение CRC-32/ISO-HDLC в диапазоне 0..4294967295. Оно подходит для полей целостности в форматах файлов и протоколах передачи, но не является криптографическим дайджестом и не должно использоваться для аутентификации или защиты от преднамеренной подмены.

TOPAZ
let checksum = Hash.crc32(Bytes.encodeUtf8("123456789"))
print("{checksum}")

Пример выводит 3421780262. Интерпретатор, generated Rust, generated Python, raw Web, Web Worker и Playground создают одно и то же беззнаковое число. std.hash.crc32 предоставляет ту же операцию.

Детерминированный фиксированный DEFLATE

Используйте Codec.deflateFixedCompress(bytes), когда формату файла нужен один канонический raw-блок DEFLATE с фиксированным Хаффманом. Результат не содержит заголовка, контрольной суммы или трейлера zlib/gzip. Поиск и память ограничены, а вход свыше 256 MiB возвращает Err.

TOPAZ
match Codec.deflateFixedCompress(Bytes.encodeUtf8("hello")) {
  case Ok(compressed) => print(compressed.toHex())
  case Err(error) => print("ошибка: {error}")
}

Интерпретатор, generated Rust, raw Web, Web Worker и Playground создают одинаковые байты. Generated Python отклоняет функцию до записи артефакта.

Детерминированный фиксированный zlib

Используйте Codec.zlibFixedCompress(bytes), когда формату файла нужен полный детерминированный поток zlib, а не raw DEFLATE. Функция записывает фиксированный заголовок 78 01, точный поток с фиксированным Хаффманом, описанный выше, и трейлер Adler-32 исходного ввода. Вход свыше 256 MiB возвращает Err.

TOPAZ
match Codec.zlibFixedCompress(Bytes.encodeUtf8("hello")) {
  case Ok(compressed) => print(compressed.toHex())
  case Err(error) => print("ошибка: {error}")
}

Пример выводит 7801cb48cdc9c90700062c0215. Интерпретатор, generated Rust, raw Web, Web Worker и Playground создают одинаковые байты, а generated Python отклоняет функцию до записи артефакта. Операция не добавляет общий Adler-32, распаковку, уровни сжатия, словари или потоковую обработку.

Защита Reed–Solomon

Codec.reedSolomon255223Protect(bytes) создаёт систематические кодовые слова RS(255,223). После каждого блока данных из 223 байт следуют 32 байта чётности; последний блок данных дополняется нулями. Исходную логическую длину хранит вызывающий код, поскольку защищённые байты не содержат префикса длины.

TOPAZ
match Codec.reedSolomon255223Protect(Bytes.encodeUtf8("hello")) {
  case Ok(protected) => print("{protected.length()} байт")
  case Err(error) => print("ошибка: {error}")
}

Вход не может быть пустым и ограничен 65 535 блоками. Функция создаёт защитные байты, но не обнаруживает и не исправляет ошибки. Интерпретатор, generated Rust, raw Web, Web Worker и Playground дают точно одинаковый результат. Generated Python отклоняет функцию до записи артефакта.

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

Основные имена проверяются статически, а виртуальный корень 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}")

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