(rontolisp) docs
← マクロ

with-output-to-string

(with-output-to-string (stream &optional string &key element-type) body...)

stream を文字列出力ストリームに束縛して本体フォームを評価し、ストリームに書き込まれた内容全体を文字列として返します。princ、prin1、print、terpri、fresh-line、write-line、write-char、write-string はオプションの stream 引数として、format は destination としてこのストリームを受け取り、各呼び出しがストリームに追記します。3 つすべてのバックエンドで動作します。

フィルポインタ付きの string を渡すと、出力はフィルポインタ経由でその文字列に追記され、 フォームは本体の最後のフォームの値を返します。文字列に出力が入るのは本体を抜けたときで、 1 文字ずつではありません。:element-type は受け付けますが効果はありません。ここでの ストリームはすべて文字ストリームです。

束縛する変数を *standard-output* と名付けると、本体の実行中は stream 引数なしの印字関数ファミリー全体がリダイレクトされます -- 呼び出された関数の内部や、destination が t の format も含みます。これらの呼び出しはコール時に *standard-output* の現在の(動的に束縛された)値を読むためです。同じリダイレクトは、*standard-output* を出力ストリームに束縛する任意の let でも機能します。

ストリーム引数に nil を渡すことは、引数を省略することと同じ意味です。これは 「生の標準出力」ではなく *standard-output* 指定子です。そのため、自分の optional 引数をそのまま転送するレンダラーという Common Lisp でよくある形が、 リダイレクト下でも期待どおりに動きます。

同じ形で *error-output* を束縛すると、warn のレポートを捕捉できます。 この変数のデフォルト値はプロセスの標準エラーなので、リダイレクトされていない警告が 標準出力に混ざることはありません。