出力ストリームはプリントによって生成された文字に何を行うかを指定します。ほとんどのプリント関数は引数としてオプションで出力ストリームを受け取ります。以下は利用できる出力ストリーム型です:
出力文字はbufferのポイント位置に挿入される。文字が挿入された分だけポイントが進む。
出力文字はmarkerがあるバッファーのマーカー位置に挿入される。文字が挿入された分だけマーカー位置が進む。ストリームがマーカーのときは、そのバッファー内のポイント位置にプリントは影響せず、この種のプリントでポイントは移動しない(マーカー位置がポイント位置かポイント位置より前の場合は除く。通常はテキストの周囲にポイントが進む)。
出力文字は文字を格納する役目をもつfunctionに渡される。この関数は1つの文字を引数に出力される文字の回数呼び出され、格納したい場所にその文字を格納する役目をもつ。
t
¶出力文字はエコーエリアに表示される。Emacsがbatchモード(batchモードを参照)で実行中なら、出力はかわりに標準出力デスクリプターに書き込まれる。
nil
¶出力ストリームにnil
が指定された場合は、かわりにstandard-output
変数の値が使用されることを意味する。この値はデフォルトの出力ストリーム(default
output stream)であり、非nil
でなければならない。
出力ストリームとしてのシンボルは、(もしあれば)そのシンボルの関数定義と等価である。
有効な出力ストリームの多くは、入力ストリームとしても有効です。したがって入力ストリームと出力ストリームの違いは、Lispオブジェクトの型ではなく、どのようにLispオブジェクトを使うかという点です。
以下はバッファーを出力ストリームとして使用する例です。ポイントは最初は‘the’の中の‘h’の直前にあります。そして最後も同じ‘h’の直前に配置されます。
---------- Buffer: foo ---------- This is t∗he contents of foo. ---------- Buffer: foo ----------
(print "This is the output" (get-buffer "foo")) ⇒ "This is the output"
---------- Buffer: foo ---------- This is t "This is the output" ∗he contents of foo. ---------- Buffer: foo ----------
次はマーカーを出力ストリームとして使用する例です。マーカーは最初はバッファーfoo
内の単語‘the’の中の‘t’と‘h’の間にあります。最後には挿入されたテキストによってマーカーが進んで、同じ‘h’の前に留まります。通常の方法で見られるようなポイント位置への影響がないことに注意してください。
---------- Buffer: foo ---------- This is the ∗output ---------- Buffer: foo ----------
(setq m (copy-marker 10)) ⇒ #<marker at 10 in foo>
(print "More output for foo." m) ⇒ "More output for foo."
---------- Buffer: foo ---------- This is t "More output for foo." he ∗output ---------- Buffer: foo ----------
m ⇒ #<marker at 34 in foo>
以下はエコーエリアに出力を表示する例です:
(print "Echo Area output" t) ⇒ "Echo Area output" ---------- Echo Area ---------- "Echo Area output" ---------- Echo Area ----------
最後は関数を出力ストリームとして使用する例です。関数eat-output
は与えられたそれぞれの文字をlast-output
の先頭にconsします(コンスセルおよびリストの構築を参照)。最後にはリストには出力されたすべての文字が逆順で含まれます。
(setq last-output nil) ⇒ nil
(defun eat-output (c) (setq last-output (cons c last-output))) ⇒ eat-output
(print "This is the output" #'eat-output) ⇒ "This is the output"
last-output ⇒ (10 34 116 117 112 116 117 111 32 101 104 116 32 115 105 32 115 105 104 84 34 10)
このリストを逆転すれば正しい順序で出力することができます:
(concat (nreverse last-output)) ⇒ " \"This is the output\" "
concat
を呼び出してリストを文字列に変換すれば、内容をより明解に確認できます。
この関数はデバッグ時の出力ストリームとして有用。これは標準エラーストリームにcharacterを書き込む。
たとえば
(print "This is the output" #'external-debugging-output) -| This is the output ⇒ "This is the output"