Variable *DEBUG-IO*, *ERROR-OUTPUT*, *QUERY-IO*, *STANDARD-INPUT*, *STANDARD-OUTPUT*, *TRACE-OUTPUT*
*standard-input*は、入力ストリーム
*error-output*, *standard-output*, *trace-output*は、出力ストリーム
*debug-io*, *query-io*は、双方向ストリーム
実装依存ですが、 開いたストリームでなければならず、 それはI/Oカスタマイズ変数に対する一般化されたsynonymストリームではなく、 あるI/Oカスタマイズ変数の値に対する一般化されたsynonymストリームの 可能性があります。 その初期値もまた一般化されたsynonymストリームであり、 *terminal-io*かその値のストリームかのどちらかを指します。
これらの変数はまとめて標準化されたI/Oカスタマイズ変数と呼ばれます。 これらは、様々な標準化された操作と機能によって使われる入出力の 標準での宛先を変更するために、束縛と代入をすることができます。
*debug-io*の値は、デバッグI/Oと呼ばれ、 対話式のデバッグ機能を使うためのストリームです。
*error-output*の値は、エラー出力と呼ばれ、 警告と非対話式エラーメッセージが送られるべきストリームです。
*query-io*の値は、クエリ―I/Oと呼ばれ、 ユーザーの質問と返答を行うために使われる双方向ストリームです。 質問はこのストリームに出力され、 返信はこのストリームから読み込まれるべきです。
*standard-input*の値は、標準入力と呼ばれ、 多くの操作で入力ストリームが指定されなかったときに デフォルトの入力元として暗に指定されたものとして 利用されるストリームです。
*standard-output*の値は、標準出力と呼ばれ、 多くの操作で出力ストリームが指定されなかったときに デフォルトの出力元として暗に指定されたものとして 利用されるストリームです。
*trace-output*の値は、トレース出力と呼ばれ、 トレースを行う関数(traceを参照)と、 timeマクロによる出力によって印字されるストリームです。
(with-output-to-string (*error-output*)
(warn "this string is sent to *error-output*"))
=> "Warning: this string is sent to *error-output*
" ;The exact format of this string is implementation-dependent.
(with-input-from-string (*standard-input* "1001")
(+ 990 (read))) => 1991
(progn (setq out (with-output-to-string (*standard-output*)
(print "print and format t send things to")
(format t "*standard-output* now going to a string")))
:done)
=> :DONE
out
=> "
\"print and format t send things to\" *standard-output* now going to a string"
(defun fact (n) (if (< n 2) 1 (* n (fact (- n 1)))))
=> FACT
(trace fact)
=> (FACT)
;; もちろん、トレースの出力の書式は実装依存です。
(with-output-to-string (*trace-output*)
(fact 3))
=> "
1 Enter FACT 3
| 2 Enter FACT 2
| 3 Enter FACT 1
| 3 Exit FACT 1
| 2 Exit FACT 2
1 Exit FACT 6"*terminal-io*, synonym-stream, time, trace, 9. コンディション, 23. リーダー, 22. プリンター
I/Oカスタマイズ変数の初期値に対する制限の意図は、 実装の柔軟性を過度に制限することなく、 これらの変数を別のI/Oカスタマイズ変数の値に束縛と代入することが 常に安全であることを保証ためです。
*debug-io*と*query-io*の初期値を同じストリームに、 *error-output*と*standard-output*の初期値を同じストリームにするような 実装が一般的です。
y-or-n-pとyes-or-no-p関数は、 入出力にクエリ―I/Oを使用します。
通常のLisp read-eval-print-loopでは、入力は標準入力から行います。 多くの入力関数について、readとread-charを含む関数は、 引数のデフォルトに標準入力のストリームを取ります。
通常のLisp read-eval-print-loopでは、出力は標準出力から行います。 多くの出力関数について、printとwrite-charを含む関数は、 引数のデフォルトに標準出力のストリームを取ります。
例えば、あるプログラムは出力をファイルに対して行いたいときは *standard-output*を束縛することによって実施するべきです。 そうすることによって (*error-output*が*terminal-io*に束縛されているときは)、 *error-output*に送信されたエラーメッセージは、 通常望まれる形で、 *terminal-io*を経由してユーザーに届きます。