text.parse
- 入力ストリームのパージング ¶入力ポートに対して単純な解析を行うユーティリティのコレクションです。 API は Oleg Kiselyov 氏の入力解析ライブラリ (http://okmij.org/ftp/Scheme/parsing.html) に 触発され、互換性を持つものです。氏のライブラリは、他のたくさんの ライブラリで使われています。特に、Scheme のみで書かれたパーサ/ジェネレータ である SSAX (http://okmij.org/ftp/Scheme/xml.html) が挙げられます。
このモジュールは、氏の input-parse.scm
や look-for-str.scm
の代わりに使うことができます。
Gauche で効果的になるように手続きを再実装しました。特に、string-set!
の使用は完全に取り除きました。インターフェースを少し拡張したので、
文字集合や述語、文字のリストにも使うことができます。
これらの手続きは、与えられた入力ポートに対してシーケンシャルに動作します。 それは、ポートから必要なだけ読み、余分な文字をバッファリングしないということです。
{text.parse
}
入力ポート in-port から、文字列 str を探します。
オプショナル引数 max-no-chars は、ポートから読み込まれる最大文字数を
制限します。省略されると、検索する範囲は EOF までとなります。
str が見つかると、手続きはすでに読み込んだ文字の数を返します。
in-port の次回の読み込みは、str の次の文字を返します。
str が見つからない場合、#f
が返ります。
注意: この手続きはその名前に「?
」がつきますが、Scheme の慣習に反し、
真偽値ではない値を返すことがあります。
{text.parse
}
現在の文字を破棄し、port から次の文字を読みます。一文字先読みするのに
便利です。port が省略されると、現在の入力ポートが使われます。
以下の手続きでは、char-list は次のどれかを意味します。
*eof*
の任意の組み合わせのリスト。
これらにより文字の集合が表現されます。シンボル *eof*
が含まれる場合、
EOF の条件もまた含まれます。*eof*
が含まれない場合、EOF の条件は
エラーとして扱われます。
{text.parse
}
port から文字を読みます。その文字が char-list に含まれている場合は
その文字を返します。そうでなければ、string を含むメッセージとともに
エラーを通知します。
{text.parse
}
char-list/number は、文字のリストか数です。
数の場合、たくさんの文字を読んで、#f
を返します。
入力が十分に長くない場合は、エラーが通知されます。
char-list/number が文字のリストの場合、その文字リストに属する文字に
出会うまで port を読み込み、その文字を返します。
port が省略された場合、現在の入力ポートが使われます。
{text.parse
}
char-list に属しない文字に出会うまで、port を読み込みます。
文字はストリームに残されます。EOF に達したら EOF が返されます。
port が省略された場合、現在の入力ポートが使われます。
この例では、入力から空白スペースをスキップしています。ポートからの次の 読み込みは、最初の空白スペースでない文字を返します。
(skip-while #[\s] port)
{text.parse
}
prefix-char-list に含まれる文字はいくつでもスキップします。
そして、break-char-list に含まれる文字に出会うまで、文字を
蓄積します。蓄積された文字群は文字列として返されます。
中断文字は port に残されます。
手続きが EOF に達し、*eof*
が break-char-list に含まれていない
場合、comment が含まれたメッセージとともにエラーが通知されます。
{text.parse
}
読み込んだ文字が char-list/pred にある限り蓄積し、文字列として
返します。char-list/pred に含まれない最初の文字はポートに残されます。
char-list/pred は文字のリストか文字を取る述語です。述語の場合、 それぞれの文字がその述語に渡され、真の値が返る場合はその文字は char-list/pred に属するとみなされます。