#:g1: KMRCLを眺める(241) byte-stream.lisp

Posted 2021-12-30 16:49:26 GMT

KMRCLを眺めるの241回目。今回は、byte-stream.lispを眺めます。

byte-stream.lisp を眺める

byte-stream.lispは(unsigned-byte 8)(uint8)な配列に対してのストリームインターフェイスを提供するライブラリです。
API(外部シンボル)は、

make-binary-array-output-streamget-output-stream-datadump-output-stream-datamake-byte-array-input-streamの4つですが、make-binary-array-output-streammake-byte-array-output-streamのタイポでしょう(もしくは修正で取り残されたか)

なお、対応している処理系はSBCL、CMLCL、Allegroだけのようです。

make-byte-array-output-stream

get-output-stream-data

dump-output-stream-data

Common Lisp標準のmake-string-output-streamget-output-stream-stringと同じような使い勝手です。
ただし、cl:get-output-stream-stringは、何度も実行可能ですが、kl:get-output-stream-dataの方はバッファをフラッシュしてしまうので、フラッシュしない場合は、dump-output-stream-dataを使うべし、ということみたいです。

(let ((out (kl::make-byte-array-output-stream)))
  (map nil
       (lambda (x) (write-byte x out))
       '(#xde #xad #xbe #xef))
  (list (kl:get-output-stream-data out)
        (kl:get-output-stream-data out)))(#(222 173 190 239) #())

(let ((out (kl::make-byte-array-output-stream))) (map nil (lambda (x) (write-byte x out)) '(#xde #xad #xbe #xef)) (list (kl:dump-output-stream-data out) (kl:dump-output-stream-data out)))(#(222 173 190 239) #(222 173 190 239))

make-byte-array-input-stream

(let ((in (kl::make-byte-array-input-stream (coerce #(222 173 190 239) '(array (unsigned-byte 8) (*))))))
  (loop :for x := (read-byte in nil in)
        :until (eq x in)
        :collect x))
→ (222 173 190 239)

実装について

SBCLとCMUCL版は結構内部関数を使っていますが、基本的にはバッファの構造体を定義して、ストリームはそのバッファ経由で読み書きする、というものです。
Allegro版はAllegroが提唱しているsimple-streamAPIで組んであります。


HTML generated by 3bmd in LispWorks 8.0.0

comments powered by Disqus