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