% 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を呼ぶという状況は
頻繁にあります。