世間(少なくとも僕の観測範囲)ではR6RSはオワコン的な風潮が多少出ていてさびしい感じがするので、R6RS処理系製作者の一人(と名乗ってもいいよね?)としては多少なりとも流行らせる努力をしたいところ。(ひいては自分の処理系の宣・・・げふんげふん)
リハビリを兼ねているので今回は簡単な小ネタを一つ。R6RSにはトランスコーダという概念がある。これを使うと、例えばUTF-8のファイルをUTF-16に変換して書き出すということが可能になる。例えば以下のようにする:
#!r6rs
(import (rnrs))
(define (convert-port input file transcoder)
(call-with-port (open-file-output-port file (file-options no-fail)
(buffer-mode block)
transcoder)
(lambda (out)
(put-string out (get-string-all input)))))
(call-with-input-file "utf-8.txt"
(lambda (in)
(convert-port in "utf-16.txt"
(make-transcoder (utf-16-codec) (eol-style crlf)
(error-handling-mode raise)))))
R6RS的には書き出し時のBOMの有無は必須ではないので、実はこれはポータブルな処理ではない点を念頭にいれていただきたい。Sagittariusは0.6.4でBOMを出力するように変更した。(BOMを書き出さないことに依存したコードは書いてないはず)。ちなみに同様の処理であるstring->utf16はBOMを出さないことが既定されている。R6RSの範疇ではUTF-8⇔UTF-16しかできないが、Sagittariusを使うとSJISとEUCも入れることができるので多少便利(宣伝)。
No comments:
Post a Comment