[Anthy-dev 2517] Re: r5rs: portの抽象化

Back to archive index

YamaKen yamak****@bp*****
2005年 10月 11日 (火) 23:12:31 JST


At Tue, 11 Oct 2005 04:06:22 -0700,
jun.l****@gmail***** wrote:
> 
> On Mon, 10 Oct 2005 02:53:45 +0900
> YamaKen <yamak****@bp*****> wrote:
> > > あ、ところで member 変数名は cport より info か desc の方がよいでする。
> > 
> > ScmCPortは抽象portの実体そのものなので、infoやdescといった具象デー
> > タを想起させるような名前は誤解の元だと思います。むしろimplとかに
> > してしまった方がいいかも。
> 
> へ? 実体 = 具象 data じゃないんですか? ScmFilePort は FILE* 持ってるし、
> ScmStrPort は buffer 持ってるし、もろにその port instance の具象
> metadata (というか state) を表現する descriptor だと思うんですが。

まずい表現でした。「抽象portそのもの」と読み替えてください。info 
やdesc(page descriptorのようなものを想定)では内部情報に直接アク
セスする事を示唆しているように取れてしまうので避けたいです。

一方UNIXのfile descriptorのように実体を間接指定するインデックス
と取られるのも面白くないです。ここに収められているのが抽象インタ
フェイスを備えたオブジェクト本体だと明示したいという事です。

> > というわけで、以下のような2段構成はどうでしょうか? この場合上記
> > の例はScmStdCharPortのrbufが溜まるまでbyte_readp()を繰り返す事で
> > 実現できます。
> 
> そうですね…双方向 multibyte port ができないかと色気を出してたんですが、
> 無理なのでそれで行きましょう。

インタフェイスとしては単一storageへのread/writeを仮定するわけで
はないのでOKだと思います。pipeやsocketは双方向で何も問題ないです。

> ただし rbuf/wbuf は区別する意味がありませ
> ん。SigScheme 側から write-char するなら必ず文字単位で data が提供される
> し、

そうでした。何考えてたんだろ。

> write-byte したときはそもそも文字が完成する事が期待できません。そし
> て multibyte bidirectional port を support しない (できない) ので
> memory の無駄です。

同一ソースに対してはScmCharPortかScmBytePortの排他利用を前提にし
てます(FILEとfdの関係に類似)。双方向性については上述の通り。

> ところで encoding 指定は symbol 推奨。case 句に渡せるし、比較 predicate
> が全部効くし、string-append で構築したくなるような事もないでしょう。もし
> あっても symbol-append 作れば済みますし。

数字で始まるコードもあり得るようなので安全側に倒して文字列にしと
いた方がいいと思います。canonicalizeすればいいという意見もあると
思いますが、canonicalizationの責任はこれより上の層に負わせたいで
す。

$ iconv -l | sort | head
437 CP437 IBM437 CSPC8CODEPAGE437
850 CP850 IBM850 CSPC850MULTILINGUAL
852 CP852 IBM852 CSPCP852
855 CP855 IBM855 CSIBM855
857 CP857 IBM857 CSIBM857
860 CP860 IBM860 CSIBM860
861 CP-IS CP861 IBM861 CSIBM861
862 CP862 IBM862 CSPC862LATINHEBREW
863 CP863 IBM863 CSIBM863
865 CP865 IBM865 CSIBM865

また、ScmCharPortの層ではなるべくSigSchemeに依存させたくないと考
えてます。コードの再利用性(uim-scmにportしたり)やメンテナンス性、
設計の単純さの面から。

> > struct ScmPortCell_ {
> >     enum ScmPortDirection direction;
> >     ScmCharPort *impl;
> > } port;
> 
> ScmObj 圧縮したら direction は ScmCharPort の方に入れることになるのかな…?

ポインタを収めるのと反対側のslotに格納できると思ってたんですが、
そうでないならScmCharPortに移しましょう。

> >     /* output */
> >     int (*vprintf)(ScmBytePort bport, const char *str, va_list args); /* tmp */
> >     int (*put_str)(ScmBytePort bport, const char *str);
> >     size_t (*put_bytestr)(ScmBytePort bport, size_t len, const char *str);
> >     int (*flush)(ScmBytePort bport);
> > };
> 
> flush 要らんす。VOLATILE_OUTPUT も要らんす。あれは C level で crash した
> ときにもどこまで実行できたか確認するための機能ですが、よく考えたら
> main.c で setbuf (stderr, NULL) した方が早いです。

Shiroさんのおっしゃる通りの理由で必要です。

> put_bytestr () は名前が非常に misleading。put_str() の方が文字コード変換
> をしそうに見える。普通に write () と puts() でいいと思うんですが…

なるほど。そうですね。R5RSのwriteとwrite(2)を区別したかったんで
すが、その2つはC由来の名前で統一しましょうか。

> > struct ScmFilePort_ {
> >     const ScmBytePortVTbl *vptr;
> > 
> >     FILE *file;
> > };
> 
> ScmStdCharPortVTbl 持っとく必要があります。

どういう目的でしょう。ちょっとわからんす。

-------------------------------
ヤマケン yamak****@bp*****



Anthy-dev メーリングリストの案内
Back to archive index