{"path":"/sutl/mlsnbn","content":{"title":"MLSNBN: the value model beneath JSON","summary":"Map, List, String, Number, Boolean, Null: separating the values from the format that transports them.","body":"[sUTL](/sutl) · [Guide](/sutl/guide) · [Reference](/sutl/reference) · [Examples](/sutl/examples)\n\n**MLSNBN** is the value model sUTL evaluates: **Map, List, String, Number, Boolean, Null**.\n\nJSON is a textual syntax. A program parses that text and obtains ordinary host-language values: dictionaries or objects, lists or arrays, strings, numbers, booleans, and null. YAML, MessagePack, and CBOR can produce the same values, within the appropriate subset. A programmer can also construct them directly, with no JSON text involved.\n\nMLSNBN names that shared model. It is a way to talk about the values without saying \"JSON\" when the text format is not what is meant.\n\n```text\nMLSNBN value :=\n    Map<String, MLSNBN value>\n  | List<MLSNBN value>\n  | String\n  | Number\n  | Boolean\n  | Null\n```\n\nMap keys are strings. Lists are ordered sequences. Numbers are the JSON number domain. Boolean and null are distinct from numbers and from each other.\n\nAn API may send JSON on the wire while its real contract is MLSNBN:\n\n```text\nHTTP bytes\n    ↓ JSON decoding\nMLSNBN value\n    ↓ application semantics\n```\n\nAnother encoding can replace JSON without changing that value model.\n\nsUTL programs are MLSNBN too. A transform is not a separate source language. It is a value in this model, which a host can store, send, inspect, and evaluate like any other value.\n\nThe longer history of the idea is in the [essay](/sutl/history).\n\n## Source\n\nAdapted from [the sUTL source material](https://github.com/emlynoregan/sutllang-site/blob/e59ecafd364848cd71a1d18ce74cdf67f2f69328/content/mlsnbn.md).\n\n[Back to sUTL](/sutl) · [Software & Agents](/topics/software-and-agents) · [All topics](/guide)","author":"Emlyn O'Regan"}}