Quick reference for the DXN format itself, independent of any implementation. See the tutorial if anything here doesn't make sense yet, or dextrin's own cheatsheet for the Elixir-API-level equivalent.
Whitespace, commas, comments
- Whitespace and
,are fully insignificant everywhere —[1 2 3]and[1, 2, 3]are identical. #starts a comment running to end of line; comments vanish before any value exists (no reader can recover them after parsing).
All 31 data types
nil nil
boolean true | false
integer -?[0-9]+ arbitrary precision
float -?[0-9]+(.[0-9]+)?([eE][+-]?[0-9]+)? | NaN | Infinity | -Infinity
decimal [0-9]+(.[0-9]+)?M exact fixed-point
rational int/uint exact ratio, never auto-reduced
string "..." UTF-8
char ?c one Unicode codepoint
symbol bare identifier unevaluated reference
keyword :name | :"..." | name: (key pos.)
list [ ... ]
tuple { ... }
map %{ ... } no ordering guarantee
ordered-map @ordered %{ ... } order is part of identity
set @{ ... }
sorted-set @sorted-set @{ ... }
struct %Name{ ... } | %Name[ ... ] needs a schema to fully interpret
array @array[ ... ] fixed-size, indexed
date @date "YYYY-MM-DD"
time @time "HH:MM:SS(.fffffffff)?" nanoseconds
datetime @datetime "YYYY-MM-DDTHH:MM:SS(Z|±HH:MM)" an instant with its offset
local-dt @local-datetime "YYYY-MM-DDTHH:MM:SS" no offset
duration @duration "P..." ISO 8601 duration
uuid @uuid "..." RFC 4122
objectid @objectid "<24 hex>" BSON's ObjectId, 12 bytes
ip @ip "192.0.2.1" | "2001:db8::/32" an address or a prefix
uri @uri "..." RFC 3986
bytes @bytes "..." base64 in text
bits @bits {"..." n} base64 and a bit count; whole bytes are bytes
regex @regex "pattern" | @regex(im) "pattern" flags: i m s u x f r
custom-tag @tag value open extension pointPlus one meta form: @dxn "1.0" — an optional header, first thing in
the document only.
Struct forms
%Name{field: value, ...} keyed -- order doesn't matter
%Name[value, ...] positional -- order is everythingBoth parse without a schema (to an opaque tagged value); a schema is what supplies field names/order/types to interpret one or convert between them.
Discard
@_ valueParses value (so a malformed discard is still a parse error) and
produces nothing — never appears in the result, no binary encoding.
Schemas
The schema language, DXNS, has a cheatsheet of its own: DXNS_CHEATSHEET.md.
Reserved leaders
None of these may begin a bare identifier: # @ % ? :.
Binary (.dxnb) envelope
"DX" <version byte> <cbor item>3-byte magic + version prefix, then one self-delimiting CBOR item.
Structs are always positional on the wire (no field names in binary —
the keyed text form is a human-readability-only convenience). @_ and
comments have no binary encoding at all — both are resolved away
before a value exists.