Shiro Kawai
shiro****@lava*****
2004年 2月 19日 (木) 06:09:43 JST
本来のchar-ready?のセマンティクスは、#tを返したら次のread-charが ブロックしない、というものです。が、これをまともに実装するのは実は大変です。 (CRLFなら1文字先読みで済みますが、例えばiso-2022-jpからのconversion portの場合、理論的には無制限の先読みが必要になります) 理屈の上では、CRをshift stateとして扱って、次にLF以外が来たら \nとその文字を返すということになるでしょうね (「フラグを立てる」のと 同様)。ただ、当面はブロックの可能性に目をつむって一文字先読み するんでもいいかなと思います。 > 1byteずつ読みたい人はread-byte,byte-ready(まだ無い)を使ってねと言うことで。 これはそういう方針ですね。byte-readyに関しては、binary I/O srfi (Alex Shinnが提出済み)が固まったら入れようと思います。 > #char-readyにしても#t,#f,#微妙 と3種類の返事を返してあげるべきかな。 R5RS的にはその解釈はきついかなあ。 > しかし、Gaucheのportは便利ですよね。 > Gaucheでは行番までデフォルトで提供しちゃうのかよ、とびっくりしました。 > 自分がJava屋だからか、R5RSのportでさえ、便利すぎに見えます。 Javaのポートは設計としては綺麗だと思いますが、 コンパイラがインライン展開しまくらない限り、 性能を出すのが難しそうだなと思いました。 Gaucheでデフォルトで行番号まで扱っているのも、性能面での懸念が あるからです。理屈上は行番号を数えるportを作ってwrapすればいいんですが、 1文字読む度に多段に関数呼び出しが発生するのを避けたかったので。 ;; 但し、現状ではportのロックが重すぎて、そういう配慮をあまり ;; 意味のないものにしてしまっていますが… --shiro