% Variable *DEBUG-IO*, *ERROR-OUTPUT*, *QUERY-IO*, *STANDARD-INPUT*, *STANDARD-OUTPUT*, *TRACE-OUTPUT*
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*
を経由してユーザーに届きます。