2007/07/19

[Common Lisp][SBCL] Bivalent Stream

Common Lisp では open の :element-type でバイナリストリームかキャラクタストリームが決定します。read-byte と read-char の両方を使えるストリームを作ることができません。
SBCL の拡張機能に Bivalent Stream があります。:element-type :default を指定することで、character と (unsigned-byte 8) のどちらでも入出力が可能になります。read-byte と read-char の両方を使うことができるストリームが作成できるのです。

CL-USER> (let ((file "/tmp/a.txt"))
(with-open-file (out file
:direction :output :external-format :utf-8
:if-exists :supersede
:element-type :default) ; これで Bivalent Stream になる
(write-char #\あ out)
(map nil #'(lambda (byte)
(write-byte byte out))
(string-to-octets "い" :external-format :utf-8)))
(with-open-file (in file
:element-type :default) ; これで Bivalent Stream になる
(loop repeat 3
do (print (read-byte in)))
(print (read-line in))))

227
129
130
"い"
"い"

ちなみに、他の拡張として Gray Stream と Simple Stream もあります。

0 件のコメント: