[Gauche-devel-jp] Re: port-current-lineについて

Zurück zum Archiv-Index

HIRAUCHI Hideyuki hira****@verys*****
2004年 2月 18日 (水) 23:18:41 JST


平内です。

またパッチを送れればと思ってソース見てたんですけど、難しいですね。

CRに対応するには2バイト先読みしとかないとダメですよね(一文字隠し持っておく)。
read-charで読んだ文字がCRのとき、次の文字によって行数が変わるのだけど、以下の場合があります。
    1.1. LFだった。                   →カウントしない。
    1.2. LFでは無かった。             →カウントする。
    1.3. 元のportがnot-readyだった。  →こまる。
1.3の場合、どうすべかな〜とこまってしまいます。
こまったといっても出来ることはこれくらいか。
    2.1. ブロックして元portからの入力を待つ
    2.2. カウントせずに読んだ文字を返す
    2.3. カウントして読んだ文字を返す
    2.4. 「LFだった」フラグを立てて、カウントせずに読んだ文字を返す
    2.5. 「LFだった」フラグを立てて、カウントして読んだ文字を返す
2.1の場合、自身がchar-readyで#tを返していたらバグ。
2.2の場合、その時点の行番をユーザーが取得し、元portがLFでない文字を返したらバグ、
2.3の場合、その時点の行番をユーザーが取得し、元portがLFを返したらバグ、
2.4の場合、2.2と同様。過去は問題ではない。
2.5の場合、2.3と同様。過去は問題ではない。
なので
    - 2.1で行くしかない
    - char-readyのときも2文字先読みして返事すればOK
と考えた訳ですが、これでいいのかな。
1byteずつ読みたい人はread-byte,byte-ready(まだ無い)を使ってねと言うことで。
#char-readyにしても#t,#f,#微妙 と3種類の返事を返してあげるべきかな。
こんな設計で良ければ、実装してみますけど。


しかし、Gaucheのportは便利ですよね。
Gaucheでは行番までデフォルトで提供しちゃうのかよ、とびっくりしました。
自分がJava屋だからか、R5RSのportでさえ、便利すぎに見えます。
read/writeなんてすごすぎだし。
デフォルトでバッファリングされてたり、peekができたり。

例えば、Javaでファイルの行番を得ようと思ったらこんな風にストリームを連結します。
    LineNumberReader(FileReader)    //LineNumberReaderはBufferedReaderの子クラス
peekしたいならこう。
    PushbackReader(BufferedReader(FileReader))
文字列の行番を得たいならこう。
    LineNumberReader(StringReader)
ファイル出力の行番を得たいならこう。
    //ライブラリでは提供されてない。誰も使わないからか。
    //仕方ないので自作。
    HandMadeLineNumberWriter(FileWriter)

こうして見るとjava.ioストリームはプアだけど、高速且つマニアックなチューニングをしたい人にはかえってありがたいような。
そういうのがあれば、吹っ切れた気持ちでGaucheのportを便利で堅牢にしたくなる、かもしれない。

--hira



Gauche-devel-jp メーリングリストの案内
Zurück zum Archiv-Index