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)))