kme-specific-proto-spec/kmon.typ
2024-12-22 20:18:49 +03:00

48 lines
4.9 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#import "head.typ" as head : *
#show: MyStyle
= KMON Specification
KMON (KM Object Notation) это множество объектов, удобных для использования в программах с динамической типизацией.
Этот документ описывает этом ножество объектов и как их интегрпретировать, а так же определяет биекцию между
множеством kmon и подмножеством строк, представляющих собой запись km-объкта.
KMON является упрощённым аналогом JSON, использующимся в KM Project. KMON это официальное название типа объектов,
однако в самом мире игры KM он известен как SON (Suckless
Object Notation).
KM-объект (объект типа kmon/KMobj) может быть одного из 5-и подтипов: null (пустой), int (число),
str (строка), arr (массив), dict (словарь). При этом int хранит в себе целое число (со знаком),
str хранит в себе строку байт (не обязательно корректную, это просто массив из октетов произвольной длины).
Arr хранит массив км-объектов, Dict хранит словарь, где ключи: строки из алфавита, состоящего лишь из
букв латинского алфавита, чисел и символов #text(fill:red)[`+` `/` `=` `-` `-`]; а значения словаря - другие
км-объекты.
Такие объекты, хранящиеся в другом км-объекти называются сыновьями родительского объекта.
Принято хранить в числовом км-объекте число от $-2^63$ до $2^63+1$.
Число записывается естесственным образом. null-объект записывается как литерал `null`.
Строка `str` может записываться в формате `'{str}'`, здесь мы окружаем строку одинарной
кавычкой. Такой способ записи может использоваться только если в строке нет символа
одинарной кавычки. Произвольную строку можно записать вторым способом:
`={len(str)}>{str}`, здесь мы перед строкой пишем знак равенства, указываем длину строки
(в шестнадцатиричной системе счисления), оканчиваем размер знаком "больше" и записываем
саму строку. Это два единственных "формальных" способа записи. Все имплементации
десериализватора должны быть способны их прочитать. Есть ещё опциональная третья запись.
`"str.sub('\', '\\').sub('"', '\"')"`. Здесь мы сперва экранируем в строке все двойные
кавычки и обратные слэши, и обрамляем получившуюся строку в двойные кавычки.
Это называется "человекочитаемый формат". Программа, посылающая км-объект в таком формате должна быть уверена, что получатель поддерживает человекочитаемый формат строк.
Вокруг записи км-объекта можно ставить справа и слева пробелы, смысл от этого не будет
меняться.
Для записи массивов все его элементы разделяются запятыми, и полученная строка окружается
квадратными скобками (слева левой, справа правой).
Запись словаря похожа на запись массива тем, что запись словаря - это разделённый
запятыми список пар (ключ, км-объект), окруженный фигурными скобками (слева левой,
справа правой). Пара ключ, км объект состоит из 3-ёх частей (которые можно окружать
и разделять пробелами): ключ "по формату словарного ключа", записанный напрямую,
потом двоеточие, после него сам км-объект, значение в словаре по данному ключу.
Ключи не должны повторяться.