Noppiのおぼえがき

Chez Schemeでコンソールに日本語を出力する

Chez Schemeでは日本語Windowsの文字コードであるShift JISに対応していないのでそのままでは日本語の文字列をコンソールに表示できません。
そこで、文字列をShift JISに変換して出力することにします。
Chez Schemeではstandard-output-portが拡張されており、バッファモードとトランスコーダという2つの引数を渡すことができます。
日本語Windowsのコンソールへの出力をする時には、バッファモードに'lineを、トランスコーダにはShift JISのコーデックと適切な改行モードを渡します。
トランスコーダは次の手続きで作ります。

(make-transcoder codec eol-style)

codecにはiconv-codecにてcp932(Shift_JIS)のコーデックを指定します。
eol-styleには'crlfを渡します。
この時、実行にはpetite.exeまたはscheme.exeと同じフォルダにiconv.dllが必要となります。
まとめるとこんな感じ。

(define shift_jis-transcoder (make-transcoder (iconv-codec "cp932") 'crlf))         ; トランスコーダの作成
(define shift_jis-output-port (standard-output-port 'line shift_jis-transcoder))    ;トランスコーダを指定して出力ポートを作成

こうして作ったポートを毎回指定して出力すればめでたく日本語が表示されるのですが、毎回指定するのはめんどくさいのでcurrent-output-portを上記ポートにすり替えます。
Chez Schemeではcurrent-output-portが拡張されてスレッドパラメータになっているので、上記ポートをパラメータとして指定すれば普通にdisplayで日本語文字列を出力することが出来るようになります。
以上をまとめたのが次のコードです。
なお、以下のコードはUTF-8(BOM無し)で保存して実行する必要があります。

サンプルコード :

#!chezscheme

(eval-when (compile) (optimize-level 3)
                    (debug-level 0)
                    (compile-imported-libraries #t)
                    (generate-inspector-information #f))

(suppress-greeting #t)

(current-output-port (standard-output-port 'line (make-transcoder (iconv-codec "cp932") 'crlf)))

(scheme-start (lambda fns (display "あいうえお\nかきくけこ\n")))  ; 試しに日本語を表示させてみる(UTF-8でファイル保存すること!)

((scheme-start))

重要なのはcurrent-output-portの行だけです。
displayで日本語を指定してもコンソールに正しく表示されます。

実行結果 :

C:\work\scheme>petite --script "nihongo.ss"
あいうえお
かきくけこ