text.edn - EDNのパーズと構築 ¶EDN (Extensible Data Notation)はデータ交換用に定められた、 Clojureのリテラル構文のサブセットです。このモジュールはEDNの読み書きをする ユーティリティを提供します。EDNの詳細については https://github.com/edn-format/ednを参照してください。
| EDN | Gauche | Note |
true | #t | |
false | #f | |
nil | nil | Clojureのnilはシンボルではなく特殊な値ですが、
Clojureにはnilというシンボルは存在できないので、
Gaucheのシンボルnilに対応させています。 |
| number | <real> | 整数と浮動小数点数。
ClojureのNとMサフィックスは無視されます。 |
| symbol | <symbol> | Clojureのシンボル名には制約があるので、
全てのGaucheのシンボルがEDNシンボルとして使えるわけではありません。
Clojureの名前空間つきシンボル(例: foo/bar) はGauche側では
単にfoo/barという名前を持つシンボルの扱いになります。
この名前から名前空間とシンボル名を取り出すユーティリティが提供されます。 |
| keyword | <keyword> | Clojureはキーワードとシンボルを別の型にしています。
ClojureキーワードはGaucheキーワード(シンボルのサブタイプ)に対応します。
Clojureのシンボルは:で始まることはないので、混同が起きることはありません。 |
| list | <list> | ClojureのリストはGaucheのリストになります。 Clojureにはドットリスト(improper list)が無いことに注意してください。 |
| vector | <vector> | ClojureのベクタはGaucheのベクタになります。 |
| map | <hash-table> | Clojureのマップは、Gaucheではedn-comparatorをハッシュ関数と比較に
使うハッシュテーブルになります。 |
| set | <set> | Clojureのセットは、Gaucheではedn-comparatorを比較に使う
<set>オブジェクトになります。<set>についてはSee scheme.set - R7RSセット参照。 |
| tagged object | <edn-object> | タグつきオブジェクトはデフォルトで<edn-object>のインスタンスになります。
タグ付きオブジェクトの解釈をカスタマイズして、特定のGaucheオブジェクトに結びつけることも
できます。 |
パーザのエラーはこのコンディションで通知されます。<error>を継承しています。
{text.edn}
EDN表現を与えられた入力ポートから読み込み、パーズ結果をGaucheオブジェクトとして
返します。iportが省略された場合は現在の入力ポートが使われます。
パーズが失敗した場合は<edn-parse-error>が投げられます。
iportから文字が先読みされる可能性があることに注意してください。
例えば入力がabc{:a b}、つまりシンボルの直後にマップが来ていたとします。
パーザは{まで読んでシンボルの終了を知り、シンボルabcを返しますが、
その時点で読まれていた{はポートに戻されないので、
続けてiportからEDNを読む場合に問題となります。
複数のEDNオブジェクトを読み込む場合はparse-edn*を使ってください。
{text.edn}
与えられた入力ポートから、EOFに達するまでEDN表現を読み込み、結果をGaucheオブジェクトの
リストとして返します。iportが省略された場合は現在の入力ポートが使われます。
パーズが失敗した場合は<edn-parse-error>が投げられます。
{text.edn}
EDN表現を文字列から読み込む便利手続きです。
パーズが失敗した場合は<edn-parse-error>が投げられます。
(parse-edn-string "[1 2 (3 4) {:a 5}]")
⇒ #(1 2 (3 4) #<hash-table general 0x1f05780>)
{text.edn}
オブジェクトobjのEDN表現を出力ポートoportに書き出します。
oportが省略された場合は現在の出力ポートが使われます。
obj中にEDNで表現できないオブジェクトがあった場合、 ジェネリック関数edn-writeが呼ばれます。下のカスタマイズの項を参照してください。 適切なメソッドが定義されていなけばエラーが投げられます。
{text.edn}
objのEDN表現を文字列で返します。
obj中にEDNで表現できないオブジェクトがあった場合、 ジェネリック関数edn-writeが呼ばれます。下のカスタマイズの項を参照してください。 適切なメソッドが定義されていなけばエラーが投げられます。
(construct-edn-string ’#(1 2 "abc")) ⇒ "[1 2 \"abc\"]"
{text.edn}
EDN表現から読まれた二つのオブジェクトが、EDNのセマンティクスで等しいかどうかを調べます。
{text.edn}
edn-equal?で等価性を判定する比較器です。ハッシュ関数も含まれます。
EDNのマップとセットは、この比較器を使うGaucheのハッシュテーブルとセットになります。
{text.edn}
EDNに使えるハッシュテーブルとセットを構築する便利手続きです。
{text.edn}
EDNのタグつきオブジェクトは、デフォルトではこのクラスのインスタンスになります。
以下のスロットがあります。どちらも変更不可です。
<edn-object>: tag ¶シンボル。オブジェクトのタグです。
<edn-object>: payload ¶オブジェクトの内容です。EDNで表現可能なオブジェクト。
例えば、#myobject {:a 1 :b 2}を読んだ場合、
タグはmyobject、内容は{:a 1 :b 2}を読んだ結果のハッシュテーブルに
なります。
{text.edn}
新たな<edn-object>のインスタンスを作って返します。
引数がEDN表現可能かどうかのチェックはされません。
呼び出し側が有効な引数を渡す必要があります。
{text.edn}
objが<edn-object>のインスタンスなら#tを、そうでなければ
#fを返します。
{text.edn}
edn-objectのタグと内容をそれぞれ返します。
{text.edn}
シンボルの、プリフィクスとベース名をそれぞれ返します。
(edn-symbol-prefix 'foo/bar) ⇒ foo (edn-symbol-basename 'foo/bar) ⇒ bar (edn-symbol-prefix 'bar) ⇒ #f (edn-symbol-basename 'bar) ⇒ bar
{text.edn}
文字列strがClojureのシンボル名として有効なら#tを、そうでなければ
#fを返します。strには名前空間を含めることもできます。
EDNのタグつきオブジェクトを、他のGaucheオブジェクトへとマップすることが出来ます。
{text.edn}
tagはシンボル、handlerは#fもしくは
タグと内容を引数に取る手続きです。
tagはClojureのシンボルとして有効な名前でなければなりません。 さもなくばエラーが投げられます。
パーザがtagをタグに持つタグつきオブジェクトを読んだら、
そのタグと内容を引数にしてhandlerを呼び出し、返り値を
パーズ結果とします。handlerに#fを渡した場合は
既に登録されたハンドラを(もしあれば)削除します。
この手続きはスレッドセーフです。
以下の例はEDNの#u8vector[1 2 3 4]を
#u8(1 2 3 4)として読み込みます。
(register-edn-object-handler! 'u8vector
(^[tag vec] (vector->u8vector vec)))
{text.edn}
tagに登録されたハンドラを返します。ハンドラが登録されていなければ#fを返します。
この手続きはスレッドセーフです。
{text.edn}
objのEDN表現を現在の出力ポートに書き出します。
construct-ednは内部的にこれを呼んでいます。
GaucheオブジェクトをEDNタグつきオブジェクトとして書き出したい場合に、
このジェネリック関数にメソッドを定義します。メソッド中で、オブジェクトの要素を
再帰的に書き出す場合はそれぞれにedn-writeを呼び出してください。
以下の例は、#u8(1 2 3 4)をEDNの#u8vector[1 2 3 4]として
書き出します。
(define-method edn-write ((x <u8vector>)) (display "#u8vector") (edn-write (u8vector->vector x)))