Extensible Data Notation
Extensible Data Notation, známé jako EDN (výslovnost e-ed-n), je datový formát používaný pro zápis jazyka Clojure Je podobný JSON, ale na rozdíl od něj podporuje více typů. Slouží pro přenos hodnot, není to typový systém, neobsahuje žádná schémata, validaci nebo něco podobného. Neobsahuje reference ani nic takového. Dokument neobsahuje žádnou kořenovou značku, je tedy vhodný pro streamování. Kódování textových řetězců je v UTF-8. Elementy jsou oddělovány bílými znaky, které nemají formátovací funkci (nadbytečné mezery se mohou vypustit bez ztráty informace).
Vestavěné elementy/typy
Null
Reprezentuje nulu, NULL, nil. Na cílové platformě by se měl číst s podobným významem přičemž NULL == NULL.
Bool
Tradiční booleanovská hodnota true, false.
Řetězec
Řetězce jsou uzavřeny v "double quotes"
. Může zahrnovat více řádků. Jsou podporovány standardní escape C / Java sekvence\t, \r, \n, \\ and \"
.
Znak
Znakům předchází zpětné lomítko: \c
. Jsou připravené zkratky pro \newline
, \return
, \space
a \tab
. Dále znaky Unicode jsou reprezentovány \uNNNN
jako v Javě. Za lomítkem nemůže být mezera.
Symbol
Symboly se používají k reprezentaci identifikátorů a měly by se mapovat na něco jiného než řetězce, pokud je to možné. Symboly jsou unikátní, symbol s jedním jménem by měl být reprezentován všude se stejnou identitou.
Symboly začínají nečíselným znakem a mohou obsahovat alfanumerické znaky a . * + ! - _ ? $ % & = < >
. * + ! - _ ? $ % & = < >
. * + ! - _ ? $ % & = < >
. Pokud -
, +
nebo .
jsou na prvním místě, druhý znak (pokud existuje) musí být nečíselný. Platí výjimka, že : #
nejsou povoleny jako první znak. Další výjimku má /
kterýžto má zvláštní význam. Může být použit pouze jednou uprostřed symbolu k oddělení předpony (často jmenného prostoru) od jména , např. my-namespace/foo
. /
sám o sobě je regulérním symbolem, ale jinak nemůže být předpona ani část názvu prázdná, pokud symbol obsahuje /
.
Pokud má symbol předponu a /
, měla by následující komponenta názvu dodržovat omezení prvního znaku pro symboly jako celek. Tím se má zabránit nejednoznačnosti při čtení kontextů, kde lze předpony považovat za implicitně zahrnuté jmenné prostory a následně je provádět.
Klíčové slovo
Jedná se o identifikátory, které jsou obvykle samopopisné. Sémanticky se podobají hodnotám výčtu. Klíčová slova se řídí pravidly symbolů, s výjimkou, že mohou (a musí) začínat :fred
např. :fred
nebo :my/fred
. Klíčové slovo nemůže začínat ::
.
Pokud se klíčová slova překládají pomocí nějaké internacionalizace tak platí, že všechny instance stejného klíčového slova poskytují stejný objekt.
Cele číslo
Celá čísla se skládají z číslic 0
- 9
, případně s předponou -
pro označení záporného čísla (explicitní uvedení +
je povoleno). Žádné celé číslo než 0 nesmí začínat na 0. Očekává se přesnost 64 bitů (signed celé číslo). Celé číslo může mít příponu N
, což znamená, že je požadována libovolná přesnost. -0 je platné celé číslo, které se neliší od 0.
Čísl s pohyblivou řádovou čárkou
Očekává se 64bitová (dvojitá) přesnost. Kromě toho číslo s pohyblivou řádovou čárkou může mít příponu M
která označuje, že je požadována přesná přesnost.
Seznam
Seznam je posloupnost hodnot. Seznam jsou reprezentován prvky uzavřenými v závorkách ()
. Seznam může obsahovat hodnoty různých typů, a může být prázdný.
(ab 42)
Vektor
Vektor je posloupnost hodnot, který podporuje náhodný přístup. Vektor je reprezentován prvky uzavřenými v hranatých závorkách []
. Vektor může obsahovat hodnoty různých typů, a může být prázdný.
[ab 42]
Mapa
Mapa je soubor asociací mezi klíči a hodnotami. Map je reprezentována páry klíč a hodnota uzavřenými v složených závorkách {}
, volitelně oddělených čárkou. Každý klíč by se měl objevit nanejvýš jednou. Nezáleží na pořadí. Vektor může být prázdný a může obsahovat hodnoty i klíče různých typů.
{:a 1, "foo" :bar, [1 2 3] four}
Set
Set je kolekce jedinečných hodnot. Set je reprezentován prvky uzavřenými v složených závorkách, před kterými je #
#{}
. Set může být prázdný. Nezáleží na pořadí, a hodnoty mohou být libovolného typu.
#{ab [1 2 3]}
Komentáře
edn podporuje pouze řádkové komentáře začínající ;
Označené elementy
edn podporuje rozšiřitelnost pomocí jednoduchého mechanismu. #
následovaný symbolem začínajícím abecedním znakem znamená, že tento symbol je značka. Značka označuje sémantickou interpretaci následujícího prvku. Předpokládá se, že implementace readeru (program, který zparsuje a zpracuje edn soubor) umožní klientům registrovat obslužné rutiny pro specifické značky. Když narazí na tag, reader nejprve přečte další prvek (který může být už hodnotou, nebo se může jednat o další tagované prvky), následně předá výsledek odpovídající rutině pro další interpretaci a výsledkem rutiny bude hodnota dat poskytovaná prvkem tag + tagged, tj. čtení/zpracování tagu a tagovaného elementu přinese jednu hodnotu. Tato hodnota je hodnota, která má být vrácena do programu, a není uživatelem dále interpretována jako edn data.
Sémantika tagu a typ a interpretace tagovaného elementu jsou definovány uživatelem.
#myapp/Person {:first "Fred" :last "Mertz"}
Pokud reader narazí na značku, pro kterou není registrován žádná obslužná rutine, není definováno co by se mělo stát. Zpracování může skončit chybou stejně tak může zpracování použít nějakou alternativní rutinu.