Das Textformat
Wie ein .dxn-Dokument aufgebaut ist: ein Wert, eine optionale Kopfzeile, Trenner ohne Bedeutung, Kommentare, Bezeichner und die drei Präfixe, mit denen alles jenseits einfacher Skalare und Listen beginnt.
Dokumente und Kopfzeile
Ein Dokument ist genau ein Wert — meist eine Map, aber auch 42 oder [1 2 3] sind vollständige Dokumente. Am Anfang darf die Kopfzeile @dxn mit einer Versionszeichenkette stehen; sie ist optional und nur als erste Form erlaubt.
@dxn "1.0"
# settings for the importer
%{ batch: 500 }Leerraum und Kommas
Leerzeichen, Tabulatoren, Zeilenumbrüche und Kommas sind allesamt Trenner, und keiner trägt Bedeutung — auch kein abschließendes oder doppeltes Komma. Diese Zeilen sind dieselbe Map, und die Liste darunter verliert nur Satzzeichen:
%{x: 1, y: 2}
%{x: 1 y: 2}
%{
x: 1
y: 2
}[1,,, 2,]
[1 2]
Kommentare
Ein # beginnt einen Kommentar bis zum Zeilenende; ein Leerzeichen danach ist nicht nötig. Blockkommentare gibt es nicht. Nach dem Parsen sind Kommentare verschwunden — kein Leser kann sie zurückgeben, und die Binärform hat keinen Platz für sie.
%{
retries: 3 # per request
#disabled is still just a comment
}%{retries:3}Bezeichner
Symbole, Keywords, Struct-Namen und Tag-Namen folgen einer Regel. Ein Bezeichner beginnt mit einem Buchstaben (Unicode XID_Start) oder _ und setzt sich mit Buchstaben, Ziffern (XID_Continue), -, ? und ! fort. Ein einzelner / darf ihn in Namensraum und Namen teilen. retry-after, valid?, Point und my-app/money sind also Bezeichner.
Reserviert sind nil, true, false, NaN und Infinity. Keines der sechs Sigil-Zeichen darf einen nackten Bezeichner einleiten:
| Sigil | Leitet ein |
|---|---|
# | einen Kommentar |
@ | ein Tag, eine Menge @{…} oder das Verwerfen @_ |
% | eine Map %{…} oder ein Struct %Name{…} |
~ | ein Datums-, Zeit-, Zeitstempel- oder Regex-Sigil |
? | ein Zeichen |
: | ein Keyword |
Tags
Ein Tag ist @, ein Bezeichner und der eine Wert, auf den es sich bezieht: @uuid "…", @ordered %{…}. Eingebaut sind @ordered, @sorted-set, @array, @datetime, @duration, @uuid, @uri und @bytes, dazu @dxn für die Kopfzeile. Jeder andere Name ist ein eigenes Tag — siehe eigene Tags.
Einen Wert verwerfen
@_ liest den folgenden Wert und verwirft ihn. Anders als ein Kommentar muss der verworfene Wert gültiges DXN sein; ein fehlerhafter ist ein Parse-Fehler, statt still übergangen zu werden. So lässt sich ein einzelnes Listenelement oder ein Wert schnell abschalten.
[1 @_ "skip me" 2 3]
[1 2 3]