ポートの実装 - 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 を返す
トランスコーダ
- 改行の取扱い
- コーデック
- エラー時の振る舞い