一般的なLispのコピーツリー:元のオブジェクトとコピーはどのオブジェクトとコピーで参照されますか?
-
13-12-2019 - |
質問
実用的な共通Lisp を読んで、LispのCOPY-TREE
関数について質問します。
本は呼び出し
の例を与えます(copy-tree '( '(1 2) '(3 4) '(5 6)))
.
説明した後、本はこの文を作ります:
元の短所が原子値を参照した場合、 コピー内の対応するCONSセルは同じ値を参照します。 したがって、オリジナルのツリーによって共通で参照されている唯一のオブジェクト コピーツリーで作成されたコピーは、5,6、およびシンボル番号です。 nil。
しかしそれは私には意味がありません。私はすべてのAtoms がオリジナルと新しいものとの間で共有されると思いました。したがって、1,2,3,4,5,6、およびNILはすべて原稿とコピーの間ですべて共有され、唯一の「新しいオブジェクト」がすべての短縮セルになります。
どちらが正しいか、なぜですか?
ありがとう。
解決
私はウェブバージョン、PDF版、ハードカバーをチェックします。最初の2つはあなたが述べるように間違っています。ハードカバーはこれを述べています(太字の強調は私のものです):
元のCONSセルがアトミック値を参照した場合、コピー内の対応するCONSセルは同じ値を参照します。したがって、元のツリーによって共通で参照された唯一のオブジェクトとコピーツリーによって生成されたコピーは、 1-6 、およびシンボルnilです。
だからハードカバーブックは正しいです。
他のヒント
はやや複雑です。
CONSセルをコピーします。通常、オブジェクトCONSセル参照はコピーされません。
しかし1つの例外があります。FIXNUMSや文字のようなデータは、短縮セル(および構造スロット、クラススロット、アレイ)にインラインで格納できます。そのようなデータ型は必ずしも式ではありません。それがEQLがある理由です。
説明は正しいですが、例はそうではありません。 copy-tree
は、そのまま1,2,3を返し、cons
セル