Next: , Previous: Input Functions, Up: Read and Print


18.4 出力ストリーム

出力ストリームは表示で生成した文字群をどのように扱うかを指定します。 ほとんどの表示関数は省略可能な引数として出力ストリームを受け付けます。 出力ストリームとして使える型は以下のとおりです。

buffer
出力文字はバッファbufferのポイント位置に挿入される。 文字が挿入されるたびにポイント位置は進められる。
marker
出力文字はマーカmarkerがあるバッファのマーカ位置に挿入される。 文字を挿入するたびにマーカ位置は進められる。 ストリームがマーカであるときには、バッファのポイント位置は影響せず、 この種の表示ではポイントを移動しない。
function
出力文字は関数functionに渡され、この関数が文字の保存に責任を持つ。 1つの文字を引数として出力する文字数の回数だけ呼び出され、 読者の望む場所に文字を保存する責任を持つ。
t
出力文字はエコー領域に表示される。
nil
出力ストリームとしてnilを指定すると、 standard-outputの値をかわりに使うことを意味する。 その値はデフォルト出力ストリームであり、 nil以外であること。
symbol
出力ストリームとしてのシンボルは、 そのシンボルの(あれば)関数定義と等価である。

正当な出力ストリームの多くは、入力ストリームとしても正当です。 入力ストリームと出力ストリームの違いは、 オブジェクト型の違いというよりは、 読者が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の先頭にコンスします (see Building Lists)。 終了後には、リストがすべての出力文字を保持していますが逆順です。

     (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を呼び出してリストを文字列に変換し、 内容を読みやすいようにしました。