% Local-Macro PPRINT-POP
Local Macro PPRINT-POP
pprint-pop
<引数なし>
=> object
object - レキシカルな現在の論理ブロック内における
印刷されるリストの要素か、nil
レキシカルな現在の論理ブロック内における印刷されるリストの要素のひとつをpop
し、
下記に定義に従い*print-length*
と*print-circle*
を処理します。
pprint-pop
が呼び出されるたびに、
レキシカルな現在の論理ブロックへ通されたリストの次の値をpop
し、
その値を返却します。
しかし、実行する前に下記の3つのテストを行います。
list
がリストではなかったとき、.
と続いてlist
の残りが印刷されます
(これにより不正な引数に直面しても堅牢な印刷関数を簡単に書くことができます)。*print-length*
がnil
ではなく、
直前の論理ブロックに含まれる中でpprint-pop
が
すでに*print-length*
の回数分呼び出されたとき、...
を印刷します
(これにより*print-length*
を適切に扱う印刷関数を簡単に書くことができます)。*print-circle*
がnil
ではなく、
のこりのリストが循環か共有の参照であるとき、
.
が印刷され続けて適切な#n#
の印が印刷されます
(これは、リスト内のcdr
の部分に循環か共有があったということです)。もし上記3つの状態のどれかが生じたとき、
指示された出力が
直前に含まれるpprint-logical-block
によって生成された
プリティプリントのストリームへ出力され、
直前に含まれるpprint-logical-block
の実行は
サフィックスの出力を除いて終了されます。
もしpprint-logical-block
が
引数のlist
にnil
を与えられたとき、
リストの処理はできませんが、
pprint-pop
はまだ*print-length*
の
サポートを得るために使うことができます。
このような状況では、
上記の最初のテストと3つめのテストは実施できず、
pprint-pop
は常にnil
を返却します。
22.2.2. プリティプリンターの使用例の、特にpprint-vector
の例をご確認ください
グローバル環境においてpprint-pop
がfbound
かどうかは
実装依存です。
しかし、グローバル環境でfbound
にある
COMMON-LISP
パッケージ内のpprint-pop
と同じシンボルを
再定義したりシャドウすることは制限されています。
pprint-logical-block
の外側で
pprint-pop
を使用しようとしたときの結果は未定義です。
なし。
現在の論理ブロックにレキシカルで関連づいたプリティプリントのストリームへ 出力が生じるかもしれません。
*print-length*
,
*print-circle*
pprint-logical-block
フォームのレキシカルではない場所で
pprint-pop
が使用されたときは、
(マクロ展開時か実行時かのどちらかで)エラーが発生します。
pprint-pop
が、pprint-logical-block
の
動的エクステントの外側で実行されたときの結果は未定義です。
pprint-exit-if-list-exhausted
,
pprint-logical-block
pprint-pop
を呼び出す前に
pprint-exit-if-list-exhausted
を呼ぶという状況は
頻繁にあります。