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*)
(3))
(fact => "
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*
を経由してユーザーに届きます。