マルチバイト対応が完了した。
後から見直したときのために簡単にまとめる。
やったことは
- VM が内部扱う文字列を UCS-4 の文字列にした
- Scheme の String が UCS-4
- (string-length "あbc") は 3 を返す
- マルチバイトのシンボルも利用可能
- wchar_t を使わずに UCS4Char を typedef して扱う
- C++ソースコード中で文字列リテラルを使う場合は L"" を使用する(簡便のためにラップするマクロを使用)
- 鬼車をひきつづき利用することで正規表現も正しく動いている
- VM が入力として受け付ける文字列は UTF-8 とした
- VM が出力する文字列は UTF-8 とした
の3つ。
また同時に VM 内部用の format 関数を書いた。
format をラップすることでエラー処理も以下のように統一的に書ける。
RAISE_ERROR("car: pair required, but got ~s", accum);
accum は文字列ではなく Scheme オブジェクト。
成果例
(call-with-output-string (lambda (out) (display #\あ out) (display "bいc" out)))
=>"あbいc"
(rxmatch-after (#/abc/ "123abcあいうえ"))
=>"あいうえ"
地味だな。
明日 Wiki の UTF-8 対応を行うのでそれが本丸だね。