3

Practical Common Lispを読んでいて、Lisp のCOPY-TREE機能について質問があります。

この本は、呼び出しの例を示しています

(copy-tree '( '(1 2) '(3 4) '(5 6)))

それを説明した後、本書は次のように述べています。

元のコンス セルが原子値を参照していた場合、コピー内の対応するコンス セルは同じ値を参照します。したがって、元のツリーと COPY-TREE によって作成されたコピーによって共通に参照されるオブジェクトは、数字 5、6、および記号 NIL だけです。

しかし、それは私には意味がありません。私はすべての原子がオリジナルと新しいものの間で共有されると思っていました。したがって、1、2、3、4、5、6、および NIL はすべてオリジナルとコピーの間で共有され、唯一の「新しいオブジェクト」はすべての CONS セルになると予想しました。

どちらが正しいですか、なぜですか?

ありがとう。

4

3 に答える 3

5

ウェブ版、pdf版、ハードカバーをチェック。あなたが述べているように、最初の2つは間違っています。ハード カバーには次のように記載されています (太字は私のものです)。

元のコンス セルが原子値を参照していた場合、コピー内の対応するコンス セルは同じ値を参照します。したがって、元のツリーと COPY-TREE によって作成されたコピーによって共通に参照されるオブジェクトは、番号1-6と記号 NIL だけです。

だからハードカバーの本が正しい。

于 2012-10-05T01:39:24.143 に答える
4

少し複雑です。

コンスセルがコピーされます。通常、コンス セルが参照するオブジェクトはコピーされません。

ただし、例外が 1 つあります。fixnum や文字などのデータは、コンス セル (および構造体スロット、クラス スロット、配列) にインラインで格納できます。このようなデータ型は、必ずしも EQ であるとは限りません。それがEQLがある理由です。

于 2012-10-03T21:34:31.543 に答える
1

説明は正しいですが、例は正しくありません。セルcopy-treeのみをコピーして、1、2、および3をそのまま返します。cons

于 2012-10-03T20:31:30.760 に答える