2

これが一度使われているのを見たことがありますが、それが何をするのか理解できませんでした。リファレンスはそれが

#n=object印刷された表現としてオブジェクトを持つオブジェクトとして読み取ります。ただし、そのオブジェクトは、構文 #n# で参照できるように、必須の符号なし 10 進整数である n でラベル付けされています。ラベルのスコープは、read の最も外側の呼び出しによって読み取られる式です。この式では、同じラベルが 2 回出現することはありません。

私にはどれがランダムに選択された 56 個の英語の単語にすぎませんか?

4

1 に答える 1

7

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 つあることを検出します。

于 2012-09-29T02:07:08.150 に答える