48 lines
4.9 KiB
Plaintext
48 lines
4.9 KiB
Plaintext
#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-ёх частей (которые можно окружать
|
||
и разделять пробелами): ключ "по формату словарного ключа", записанный напрямую,
|
||
потом двоеточие, после него сам км-объект, значение в словаре по данному ключу.
|
||
Ключи не должны повторяться.
|