マルチバイト対応完了 - Scheme VM を書く

マルチバイト対応が完了した。
後から見直したときのために簡単にまとめる。
やったことは

  • VM が内部扱う文字列を UCS-4 の文字列にした
    • Scheme の String が UCS-4
      • (string-length "あbc") は 3 を返す
      • マルチバイトのシンボルも利用可能
    • wchar_t を使わずに UCS4Char を typedef して扱う
    • C++ソースコード中で文字列リテラルを使う場合は L"" を使用する(簡便のためにラップするマクロを使用)
    • 鬼車をひきつづき利用することで正規表現も正しく動いている
  • VM が入力として受け付ける文字列は UTF-8 とした
    • 入力直後に UCS-4 に変換される
  • VM が出力する文字列は UTF-8 とした
    • 出力直前に 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あいうえ"))
=>"あいうえ"

地味だな。
明日 WikiUTF-8 対応を行うのでそれが本丸だね。