Lispオブジェクトの複合体における共有構造や循環構造を表現するには、リーダー構文の ‘#n=’ および ‘#n#’ を使用できます。
オブジェクトの前に #n=
を付けると、後で参照するためのラベル付けができます。その後、別の箇所で同じオブジェクトを参照する際に #n# を使用できます。ここでは、n
はある整数です。例えば、最初の要素が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 オブジェクト内の循環構造や共有構造を記録するために、この構文を生成できます。出力に影響を与える変数を参照してください。