TL;DR
extensible data notation の略で、値をやり取りするためのテキストのデータ記法である。edn を拡張したものが Clojure のプログラムの表現に使われている。
なぜ必要か
アプリケーションに十分な表現力を持ちながら、慣習や文脈に頼らない単純な記法を目指している。トップレベルを囲む要素がないので、ストリーミングや対話的な使い方に向いている。Datomic などのアプリケーションではデータ転送の形式として使われている。
edn は型システムやスキーマではなく、オブジェクトシステムでもない。参照型を持たず、値だけを表す。
仕組み
次の要素を表せる。
nil、真偽値(true、false)- 文字列、文字(
\newlineなど) - シンボル、キーワード(
:で始まるシンボル) - 整数(64 ビット符号付き。
Nを付けると任意精度)、浮動小数点数(64 ビット倍精度。Mを付けると正確な精度) - リスト
()、ベクタ[]、マップ{}、セット#{}
# に続くシンボルはタグで、次の要素の意味を表す。読み込み側はタグごとにハンドラを登録できる。組み込みのタグには、日時を表す #inst と UUID を表す #uuid がある。プレフィックスのないタグは組み込み用に予約されており、独自のタグにはプレフィックスが必要である。
; から行末まではコメントになる。#_ は次の要素を読んで捨てる。
例
[a b #_foo 42] ; [a b 42] として読まれるBabashka の設定ファイル bb.edn は edn で書く。