Common Lisp では、リーダーとプリンターによって使用されます。
このようにして、ある S 式でオブジェクトにラベルを付け、S 式の別の場所でそれを参照できます。
ラベル#someinteger=
の後には s 式が続きます。整数は一意である必要があります。1 つの s 式内でラベルを 2 回使用することはできません。
ラベルへの参照は#someinteger#
. 整数は、参照する s 式を識別します。ラベルを参照する前に、ラベルを導入する必要があります。参照は、s 式内で複数回使用できます。
これは、たとえば、循環リストまたは共有データ オブジェクトを含むデータ構造の読み取りと印刷に使用されます。
簡単な例を次に示します。
? '(#1=(1 . 2) (#1#))
として読む
((1 . 2) ((1 . 2)))
これにも注意してください:
? (eq (first *) (first (second *)))
T
それは 1 つの同一のコンス セルです。
循環リストを試してみましょう。
プリンターが循環リストを処理し、それらを永久に印刷しないことを確認してください...
? (setf *print-circle* t)
T
今、リストを作成しています:
? (setf l1 (list 1 2 3))
(1 2 3)
最後の cdr を最初の cons に設定しています。
? (setf (cdr (last l1)) l1)
#1=(1 2 3 . #1#)
上記のように、印刷されたリストにはラベルが付けられ、最後の cdr はそのラベルへの参照です。
同じ表記法を使用して、循環リストを直接入力することもできます。読者はそれを理解しています:
? '#1=(1 2 3 . #1#)
#1=(1 2 3 . #1#)
このような構成を処理するようにプリンターに指示したので、最初の例の式を試すことができます。
? '(#1=(1 . 2) (#1#))
(#1=(1 . 2) (#1#))
これで、プリンターは同じ cons オブジェクトへの参照が 2 つあることを検出します。