ポートの実装 - Scheme VM を書く

あとで多少変わるかもしれませんが C++ の世界で

  • BinaryOutputPort
  • BinaryOutputFilePort
  • TextualOutputPort
  • Transcoder
  • Codec
  • ByteVector

を実装した。


以下のように使います。

UTF8Codec u;
Transcoder t(u, Transcoder::LF, Transcoder::IGNORE);
TextualOutputPort out(new BinaryOutputFilePort(stdout), t);
out.putChar(UCS4_STR("あ")[0]);

以下なんとなくメモ。

Binary Output Port

Binary Output Portインターフェース

  • put-u8
  • putbytevector

Binary Output Portの実装

  • ファイル
  • 標準出力
  • カスタムポート
  • bytevector ポート

実装のうち上2つは素直に実装すれば良い。
カスタムポートは初期化時に write! をうけとり以下のような擬似コードで動けば良い

put-u8(x)
{
    (write! #vu8(x) 0 1)
}

Binary Input Port

Binary Input Portインターフェース

  • get-u8
  • lookahead-u8
  • get-bytevector-xxx

Textual Input Port

Textual Input Portインターフェース

  • get-char
  • get-string-n
  • get-datum

Textual Output Port

Textual Output Portインターフェース

  • put-char
  • put-string
  • put-datum

put-char が実装できればあとは簡単。

Textual Output Port の実装

  • ファイル
  • 標準出力
  • カスタムポート
  • bytevector ポート
  • 文字列ポート(トランスコーダなし or 空)

BinaryPort を持つ感じで良さそうだね。

コーデック

  • ucs4char を受け取り bytevector を返す

トランスコーダ

  • 改行の取扱い
  • コーデック
  • エラー時の振る舞い