一般的なLispのコピーツリー:元のオブジェクトとコピーはどのオブジェクトとコピーで参照されますか?

StackOverflow https://stackoverflow.com//questions/12716371

  •  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セル

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top