Gauche:Textual/Binary Ports
Shiro(2012/01/08 06:16:28 UTC):
R6RSでもR7RSでもtextual portとbinary portの区別がある。Gaucheのportはどちらでも使えるので、安直なadaptationとしてはどちらのモードでopenしても1種類のportを返し、それはbinary-port?
にもtextual-port?
にも#t
と応える、とする手がある。
けれどtextual portとbinary portを分けるというのは設計としては綺麗だし、性能の点からどちらかに特化したportが将来作られるのはあり得る。また、portからジェネレータを生成する時に、textual-portならデフォルトで文字のジェネレータ、binary-portならデフォルトで数値のジェネレータ、となると自然かもしれない。
すると、portの属性として次の2種類を備えておく必要がありそうだ。
- capability: binaryのみ、textualのみ、両方
- preference: デフォルトでbinaryか、textualか
このうち、capabilityがbinary only / textual only なら preferenceは自動的に固定されるので、以下4通りの組み合わせを持っておけば良い。
Type | Capability | Preference |
binary-only
| binary | binary |
textual-only
| textual | textual |
binary-preferred
| binary/textual | binary |
textual-preferred
| binary/textual | textual |
(2012/01/08 09:52:14 UTC): いや、しばらく考えてみたが、portの種別(textualかbinaryか)をほとんど意識する必要のない現状で、どちらがpreferredかによって振る舞いが変わるのはむしろ混乱のもとでしかない、と思い直した。ジェネレータインタフェースについても、どちらかをcallerに明示させるか別々のAPIを用意するかして、capableでなければエラーで弾く、としておいた方が良さそうだ。 ということでここでの分類の考察は一時棚上げとしておく。