Next: , Previous: Output Streams, Up: Read and Print


18.5 出力関数

本節ではLispオブジェクトを表示する、 つまり、オブジェクトを表示表現に変換するLisp関数について述べます。

Emacsの表示関数のなかには、正しく読み取れるように クォート文字を出力に追加するものがあります。 使用されるクォート文字は‘"’と‘\’です。 これらは、文字列とシンボルを区別したり、 文字列やシンボル内の句読点文字を読み取るときに区切り文字として扱うこと を防ぎます。 詳しくはSee Printed Representation。 出力関数を選べば、クォートのありなしを指定できます。

テキストをLispシステムへ読み取る意図がある場合には、 曖昧さを避けるためにクォート文字付きで表示するべきです。 Lispプログラマに対してLispオブジェクトを明確に記述する場合も同様です。 しかし、人間向けの見やすい出力が目的であれば、 クォートせずに表示するのが普通はよいでしょう。

Lispオブジェクトはそれ自身を参照できます。 自己参照しているオブジェクトを普通の方法で表示するには 無限のテキストが必要であり、 そのような試みは無限再帰をもたらします。 Emacsはそのような再帰を検出し、 すでに表示したオブジェクトを再帰的に表示するかわりに ‘#level’を表示します。 たとえば、‘#0’は、現在の表示操作においてレベル0のオブジェクトを 再帰的に参照することを示します。

     (setq foo (list nil))
           (nil)
     (setcar foo foo)
           (#0)

以下の関数では、streamは出力ストリームを表します。 (出力ストリームについては前節を参照。) streamnilであったり省略すると、 standard-outputの値をデフォルトにします。

— Function: print object &optional stream

関数printは便利な表示方法である。 オブジェクトobjectの表示表現を ストリームstreamに出力し、 objectの前後に改行を1つずつ表示する。 クォート文字を使う。 printobjectを返す。 たとえばつぎのとおり。

          (progn (print 'The\ cat\ in)
                 (print "the hat")
                 (print " came back"))
               -|
               -| The\ cat\ in
               -|
               -| "the hat"
               -|
               -| " came back"
               -|
                " came back"
— Function: prin1 object &optional stream

この関数はオブジェクトobjectの表示表現を ストリームstreamに出力する。 printのようには出力を区切る改行を表示しないが、 printと同様にクォート文字を用いる。 objectを返す。

          (progn (prin1 'The\ cat\ in)
                 (prin1 "the hat")
                 (prin1 " came back"))
               -| The\ cat\ in"the hat"" came back"
                " came back"
— Function: princ object &optional stream

この関数はオブジェクトobjectの表示表現を ストリームstreamに出力する。 objectを返す。

この関数は、readではなく人が読みやすい出力を意図しており、 クォート文字を挿入せず、文字列を囲むダブルクォートも出力しない。 空白も追加しない。

          (progn
            (princ 'The\ cat)
            (princ " in the \"hat\""))
               -| The cat in the "hat"
                " in the \"hat\""
— Function: terpri &optional stream

この関数はストリームstreamに改行を出力する。 関数名は『terminate print』の略。

— Function: write-char character &optional stream

この関数は文字characterをストリームstreamへ出力する。 characterを返す。

— Function: prin1-to-string object &optional noescape

この関数は同じ引数に対してprin1が表示するであろう テキストから成る文字列を返す。

          (prin1-to-string 'foo)
                "foo"
          (prin1-to-string (mark-marker))
                "#<marker at 2773 in strings.texi>"

noescapenil以外であると、 出力にはクォート文字を使わない。 (この引数は、Emacs 19版以降で使える。)

          (prin1-to-string "foo")
                "\"foo\""
          (prin1-to-string "foo" t)
                "foo"

文字列としてのLispオブジェクトの表示表現を得るための別の方法については、 String Conversionformatを参照。

— Macro: with-output-to-string body...

このマクロは、standard-outputを文字列への出力と設定して フォームbodyを実行する。 そして、その文字列を返す。

たとえば、カレントバッファの名前が‘foo’であると

          (with-output-to-string
            (princ "The buffer is ")
            (princ (buffer-name)))

"The buffer is foo"を返す。