Shammer's Philosophy

My private adversaria

format や prin1 で文字列を受け取る

Lisp には string stream というのがある。どういう時に使うかはよくわからなかったが、即どこかの stream に書き出し、というようなことをせずに一旦出力される予定の文字列をバッファしておくのに使えそうだ。こういった使い方のためにあるものとはとても思えないし、たぶんそうではないと思うけれども。

(let ((f (make-string-output-stream)))
  (let ((*standard-output* f))
    (format t "0123456789")
    (format t "xxx"))
  (format t "OK")
  (format t (get-output-stream-string f)))
(quit)

標準出力に文字を出力するなら、実行された順番に出力される。上記の例だと、通常は 0123456789xxxOKとなるはずだが、OK0123456789xxxとなる。*standard-output* を入れ替えたブロックを

(load "some-file.lisp")

というようにして、some-file.lisp を以下のようにしても同じ結果を得ることができた。

(format t "0123456789")
(format t "xxx~%")

何かフレームワークのようなものを作成して、呼び出した外部ファイルで文字情報等を出力、実際の出力のタイミングはフレームワーク内で制御したい、というような場合はこのテクニックが使えそうだ。