For Development HEAD DRAFTSearch (procedure/syntax/module):

12.66 text.edn - EDNのパーズと構築

Module: text.edn

EDN (Extensible Data Notation)はデータ交換用に定められた、 Clojureのリテラル構文のサブセットです。このモジュールはEDNの読み書きをする ユーティリティを提供します。EDNの詳細については https://github.com/edn-format/ednを参照してください。

EDNGaucheNote
true#t
false#f
nilnilClojureのnilはシンボルではなく特殊な値ですが、 Clojureにはnilというシンボルは存在できないので、 Gaucheのシンボルnilに対応させています。
number<real>整数と浮動小数点数。 ClojureのNMサフィックスは無視されます。
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オブジェクトに結びつけることも できます。

パーザ

Condition Type: <edn-parse-error>

パーザのエラーはこのコンディションで通知されます。<error>を継承しています。

Function: parse-edn :optional iport

{text.edn} EDN表現を与えられた入力ポートから読み込み、パーズ結果をGaucheオブジェクトとして 返します。iportが省略された場合は現在の入力ポートが使われます。

パーズが失敗した場合は<edn-parse-error>が投げられます。

iportから文字が先読みされる可能性があることに注意してください。 例えば入力がabc{:a b}、つまりシンボルの直後にマップが来ていたとします。 パーザは{まで読んでシンボルの終了を知り、シンボルabcを返しますが、 その時点で読まれていた{はポートに戻されないので、 続けてiportからEDNを読む場合に問題となります。 複数のEDNオブジェクトを読み込む場合はparse-edn*を使ってください。

Function: parse-edn* :optional iport

{text.edn} 与えられた入力ポートから、EOFに達するまでEDN表現を読み込み、結果をGaucheオブジェクトの リストとして返します。iportが省略された場合は現在の入力ポートが使われます。

パーズが失敗した場合は<edn-parse-error>が投げられます。

Function: parse-edn-string str

{text.edn} EDN表現を文字列から読み込む便利手続きです。

パーズが失敗した場合は<edn-parse-error>が投げられます。

(parse-edn-string "[1 2 (3 4) {:a 5}]")
 ⇒ #(1 2 (3 4) #<hash-table general 0x1f05780>)

構築

Function: construct-edn obj :optional oport

{text.edn} オブジェクトobjのEDN表現を出力ポートoportに書き出します。 oportが省略された場合は現在の出力ポートが使われます。

obj中にEDNで表現できないオブジェクトがあった場合、 ジェネリック関数edn-writeが呼ばれます。下のカスタマイズの項を参照してください。 適切なメソッドが定義されていなけばエラーが投げられます。

Function: construct-edn-string obj

{text.edn} objのEDN表現を文字列で返します。

obj中にEDNで表現できないオブジェクトがあった場合、 ジェネリック関数edn-writeが呼ばれます。下のカスタマイズの項を参照してください。 適切なメソッドが定義されていなけばエラーが投げられます。

(construct-edn-string ’#(1 2 "abc")) ⇒ "[1 2 \"abc\"]"

ユーティリティ

Function: edn-equal? a b

{text.edn} EDN表現から読まれた二つのオブジェクトが、EDNのセマンティクスで等しいかどうかを調べます。

Variable: edn-comparator

{text.edn} edn-equal?で等価性を判定する比較器です。ハッシュ関数も含まれます。 EDNのマップとセットは、この比較器を使うGaucheのハッシュテーブルとセットになります。

Function: edn-map key value …
Function: edn-set item …

{text.edn} EDNに使えるハッシュテーブルとセットを構築する便利手続きです。

Class: <edn-object>

{text.edn} EDNのタグつきオブジェクトは、デフォルトではこのクラスのインスタンスになります。 以下のスロットがあります。どちらも変更不可です。

Instance Variable of <edn-object>: tag

シンボル。オブジェクトのタグです。

Instance Variable of <edn-object>: payload

オブジェクトの内容です。EDNで表現可能なオブジェクト。

例えば、#myobject {:a 1 :b 2}を読んだ場合、 タグはmyobject、内容は{:a 1 :b 2}を読んだ結果のハッシュテーブルに なります。

Function: make-edn-object tag payload

{text.edn} 新たな<edn-object>のインスタンスを作って返します。 引数がEDN表現可能かどうかのチェックはされません。 呼び出し側が有効な引数を渡す必要があります。

Function: edn-object? obj

{text.edn} obj<edn-object>のインスタンスなら#tを、そうでなければ #fを返します。

Function: edn-object-tag edn-object
Function: edn-object-payload edn-object

{text.edn} edn-objectのタグと内容をそれぞれ返します。

Function: edn-symbol-prefix symbol
Function: edn-symbol-basename symbol

{text.edn} シンボルの、プリフィクスとベース名をそれぞれ返します。

(edn-symbol-prefix 'foo/bar) ⇒ foo
(edn-symbol-basename 'foo/bar) ⇒ bar

(edn-symbol-prefix 'bar) ⇒ #f
(edn-symbol-basename 'bar) ⇒ bar
Function: edn-valid-symbol-name? str

{text.edn} 文字列strがClojureのシンボル名として有効なら#tを、そうでなければ #fを返します。strには名前空間を含めることもできます。

カスタマイズ

EDNのタグつきオブジェクトを、他のGaucheオブジェクトへとマップすることが出来ます。

Function: register-edn-object-handler! tag handler

{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)))
Function: edn-object-handler tag

{text.edn} tagに登録されたハンドラを返します。ハンドラが登録されていなければ#fを返します。 この手続きはスレッドセーフです。

Generic Function: edn-write obj

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


For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT