Next: 出力に影響する変数, Previous: 出力ストリーム, Up: Lispオブジェクトの読み取りとプリント [Contents][Index]
このセクションではオブジェクトをオブジェクトのプリント表現に変換して、LispオブジェクトをプリントするLisp関数を説明します。
Emacsプリント関数には、正しく読み取れるように必要なとき出力にクォート文字を追加するものがあります。使用されるクォート文字は‘"’と‘\’です。これらは文字列をシンボルと区別するとともに、文字列とシンボル内の区切り文字が読み取りの際に区切り文字として扱われることを防ぎます。完全な詳細はプリント表現と読み取り構文を参照してください。クォートするかしないかはプリント関数の選択によって指定できます。
そのテキストがLispに読み戻す場合、またはLispプログラマーにLispオブジェクトを明解に説明するのが目的の場合は、曖昧さを避けるためにクォート文字をプリントするべきです。しかしプログラマー以外の人間にたいして出力の見栄えを良くするのが目的なら、通常はクォートなしでプリントしたほうがよいでしょう。
Lispオブジェクトは自己参照ができます。通常の方法で自己参照オブジェクトをプリントするにはテキストが無限に必要であり、その試みにより無限再帰が発生する恐れがあります。Emacsはそのような再帰を検知して、すでにプリントされたオブジェクトを再帰的にプリントするかわりに、‘#level’をプリントします。たとえば以下はカレントのプリント処理において、レベル0のオブジェクトを再帰的に参照することを示しています:
(setq foo (list nil)) ⇒ (nil) (setcar foo foo) ⇒ (#0)
以下の関数ではstreamは出力ストリームを意味します(出力ストリームの説明は前のセクションを参照。デバッグではストリーム値としてexternal-debugging-outputも有用)
streamがnil
か省略された場合のデフォルトはstandard-output
の値です。
print
関数はプリントを行うための便利な手段である。この関数はobjectの前後に改行を付与してobjectのプリント表現をstreamにプリントする。クォート文字が使用される。print
はobjectをリターンする。たとえば:
(progn (print 'The\ cat\ in) (print "the hat") (print " came back")) -| -| The\ cat\ in -| -| "the hat" -| -| " came back" ⇒ " came back"
この関数は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"
overridesが非nil
なら、それはt
(すべてのプリンター関連変数にたいしてデフォルトとしてprin1
を使うよう指示する)、あるいはセッティングのリストであること。詳細については出力変数のオーバーライドを参照のこと。
この関数はobjectのプリント表現をstreamに出力する。objectをリターンする。
この関数はread
ではなく人間が読める出力を生成することを意図しているので、クォート文字を挿入せず文字列のコンテンツの前後にダブルクォート文字を配置しない。各呼び出しの間にスペースを何も出力しない。
(progn (princ 'The\ cat) (princ " in the \"hat\"")) -| The cat in the "hat" ⇒ " in the \"hat\""
この関数はstreamに改行を出力する。名前の由来は“terminate
print(プリントを終端する)”。ensureが非nil
の場合には、streamがすでに行頭にあれば改行をプリントしない。この場合にはstreamに関数は指定できず、指定するとエラーがシグナルされる。この関数は改行をプリントしたらt
をリターンする。
この関数はcharacterをstreamに出力する。characterをリターンする。
端末に出力を送信するようなEmacsベースのバッチスクリプトでは、standard-output
に改行文字を書き込むたびにEmacsが自動的に出力を表示する。この関数を使えば最初に改行文字を送信せずにstandard-output
をフラッシュ(flush)できるので、不完全な行を表示することができる。
この関数は同じ引数でprin1
がプリントするテキストを含む文字列をリターンする。
(prin1-to-string 'foo) ⇒ "foo"
(prin1-to-string (mark-marker)) ⇒ "#<marker at 2773 in strings-ja.texi>"
If overrides is non-nil
, it should either bet
(which tellsprin1
to use the defaults for all printer related variables), or a list of settings. See 出力変数のオーバーライド, for details.
noescapeが非nil
なら出力中のクォート文字の使用を抑制する(この引数はEmacsバージョン19以降でサポートされた)。
(prin1-to-string "foo") ⇒ "\"foo\""
(prin1-to-string "foo" t) ⇒ "foo"
Lispオブジェクトのプリント表現を文字列として取得する別の手段については、文字列のフォーマットのformat
を参照のこと。
このマクロは出力を文字列に送るようstandard-output
をセットアップしてフォームbodyを実行する。その文字列をリターンする。
たとえばカレントバッファー名が‘foo’なら、
(with-output-to-string (princ "The buffer is ") (princ (buffer-name)))
は"The buffer is foo"
をリターンする。
この関数はprin1
と同じようにobjectをstreamに出力するが、より優雅(pretty)な方法でこれを行う。すなわちこの関数は人間がより読みやすいようにオブジェクトのインデントとパディングを行う。
任意のバイナリーデータを書き込んだり非POSIXホストで改行変換を回避するためにこのセクションで説明した関数を使用してbatchモードでバイナリーI/Oモードを使用する必要がある場合にはset-binary-modeを参照してください。
Next: 出力に影響する変数, Previous: 出力ストリーム, Up: Lispオブジェクトの読み取りとプリント [Contents][Index]