[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 の両方を使うことができるストリームが作成できるのです。
(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 件のコメント:
コメントを投稿