複雑なLispオブジェクトでの共有された構造や循環する構造を表すために、リーダー構成‘#n=’と‘#n#’を使用することができます。
後でオブジェクトを参照するには、オブジェクトの前で#n=
を使用します。その後で、他の場所にある同じオブジェクトを参照するために、#n#
を使用することができます。ここでnは任意の整数です。たとえば以下は、1番目の要素が3番目の要素にも繰り替えされるリストを作成する方法です:
(#1=(a) b #1#)
これは、以下のような通常の構文とは異なります
((a) b (a))
これは1番目の要素と3番目の要素がそっくりなリストですが、これらは同じLispオブジェクトではありません。以下で違いを見ることができます:
(prog1 nil (setq x '(#1=(a) b #1#))) (eq (nth 0 x) (nth 2 x)) ⇒ t (setq x '((a) b (a))) (eq (nth 0 x) (nth 2 x)) ⇒ nil
“要素”として自身を含むような循環する構造を作成するために、同じ構文を使用できます。以下は例です:
#1=(a #1#)
これは2番目の要素がそのリスト自身であるリストを作成します。これが実際にうまくいくのか、以下で確認できます:
(prog1 nil (setq x '#1=(a #1#))) (eq x (cadr x)) ⇒ t
変数print-circle
を非nil
値にバインドした場合、Lispプリンターは、循環および共有されるLispオブジェクトを記録するこの構文を生成することができます。出力に影響する変数を参照してください。