本節では、Lispオブジェクトを出力するためのLisp関数――オブジェクトを出力形式に変換する関数――について解説します。
Emacsの印刷関数の中には、適切に読み取れるよう、必要に応じて出力にクォート文字を追加するものがあります。使用されるクォート文字は ‘"’ および ‘\’ で、これらによって文字列とシンボルが区別され、読み取り時に文字列やシンボル内の句読点文字が区切り文字として解釈されるのを防ぎます。詳細については、印刷表現と読み取り構文を参照してください。クォートを使用するかどうかは、印刷関数の選択によって指定します。
テキストをLispに読み込ませる場合は、曖昧さを避けるため、クォート文字を用いて出力すべきです。同様に、Lispプログラマー向けにLispオブジェクトを明確に記述することが目的である場合も同様です。ただし、出力の目的が人間にとって見栄えを良くすることであるなら、通常はクォートなしで出力する方が適切です。
Lispのオブジェクトは自分自身を参照できます。自己参照オブジェクトを通常の方法で出力するとテキストが無限に必要となり、その試みが無限再帰を引き起こす可能性があります。Emacsはこのような再帰を検出し、すでに出力中のオブジェクトを再帰的に出力する代わりに ‘#level’ を出力します。例えば、ここでの ‘#0’ は、現在の出力操作におけるレベル0のオブジェクトへの再帰的な参照を示しています:
(setq foo (list nil))
⇒ (nil)
(setcar foo foo)
⇒ (#0)
以下の関数において、stream
は出力ストリームを表します。(出力ストリームの説明については、前節を参照してください。また、デバッグに便利なストリーム値である external-debugging-output
も参照してください。)stream が nil
であるか、あるいは省略されている場合は、デフォルトで standard-output
の値となります。
print 関数は、便利な出力手段です。object
から stream までの表示形式を出力し、さらに object の前に1行、後にもう1行の改行を出力します。引用符が使用されます。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 へフラッシュできるため、不完全な行を表示することが可能になります。
この関数は、同じ引数に対して prin1 が出力したであろうテキストを含む文字列を返します。
(prin1-to-string 'foo)
⇒ "foo"
(prin1-to-string (mark-marker))
⇒ "#<marker at 2773 in strings.texi>"
overrides が nil 以外の場合、それは
t(prin1
にすべてのプリンター関連変数のデフォルト値を使用するよう指示するもの)か、あるいは設定のリストである必要があります。詳細は 出力変数のオーバーライド を参照してください。
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までを出力しますが、より見栄えの良い形式で行います。つまり、オブジェクトをインデントして埋めることで、人間がより読みやすくします。
バッチモードでバイナリI/Oを使用する必要がある場合(例えば、本節で説明する関数を用いて任意のバイナリデータを書き出す場合や、非POSIXホストで改行コードの変換を回避する場合など)は、set-binary-modeを参照してください。