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() создаёт неизменяемый снимок.
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.
Пример
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}")