clojure.edn
Clojure のデータ記法 EDN を文字列やストリームから読み取る
名前空間です。Clojure と同じくプログラムより先に読み込まれているので、clojure.edn/read-string
は require なしで使えます。すべてのバックエンドで動きます。
| var | 振る舞い |
|---|---|
read-string | (read-string s) / (read-string opts s): 文字列の最初のデータを返す。nil には nil を返し、入力の終わりでは nil(引数 1 つのとき)、:eof オプションの値、または EOF while reading エラーになる |
read | (read) / (read stream) / (read opts stream): ストリーム(省略時は *in*)からデータを 1 つ読み、ストリームをその直後に残す。入力の終わりでは :eof オプションの値かエラーになる |
EDN はデータだけを表します。クォートはシンボルの一部で('a はシンボル 'a として読まれます)、
シンタックスクォート、~、@、#'、#(...)、#"..."、#=、#? はオラクルと同じメッセージで
拒否されます。自動解決の ::keyword も同様です。数値は数字か、符号と数字で始まるため、.5 は
シンボルです。マップのキーやセットの要素が重複すると Duplicate key エラーになります。
タグ付きリテラル
#tag value は value を読み、:readers マップがタグのシンボルに対して持つ関数を呼びます。
なければ組み込みの #inst と #uuid(ソースと同じく読まれる値)を使い、
それもなければ :default 関数をタグと値で呼びます。どれも受け付けないタグは
No reader function for tag エラーです。リーダーには関数値なら何でも使えます。関数、var、
キーワード、マップのいずれでも構いません。オラクルと同じく、EDN の読み取りは *data-readers* も
*default-data-reader-fn* も参照しません。
違い
readは文字ストリームなら何でも受け付けます。素のclojure.java.io/readerも読めますが、 オラクルはjava.io.PushbackReaderを要求します。NとMの数値は、ただの整数と正確な比として読まれます(構文)。- シンボルはメタデータを持たないため、
^:k symはメタデータのないシンボルとして読まれます。