Arbre de copie de Common Lisp :Quels objets seront référencés en commun par l’original et la copie ?

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

  •  13-12-2019
  •  | 
  •  

Question

je lis Common Lisp pratique, et j'ai une question sur Lisp COPY-TREE fonction.

Le livre donne l'exemple d'appeler

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

Après l'avoir expliqué, le livre fait cette déclaration :

Lorsqu'une cellule CONS dans l'original a référencé une valeur atomique, la cellule CONS correspondante de la copie référendra la même valeur.Ainsi, les seuls objets référencés en commun par l'arborescence d'origine et la copie produite par la copie-arbre sont les nombres 5, 6 et le symbole nil.

Mais cela n'a pas de sens pour moi.Je pensais tous les atomes serait partagé entre l'original et le nouveau.Par conséquent, je m'attendais à ce que 1, 2, 3, 4, 5, 6 et NIL soient tous partagés entre l'original et la copie, et que les seuls « nouveaux objets » soient toutes les cellules CONS.

Lequel est correct et pourquoi ?

Merci.

Était-ce utile?

La solution

Je vérifie la version Web, une version PDF et la couverture rigide.Les deux premiers sont faux comme vous l'énoncez.La couverture difficile indique ceci (l'accent ailli audacieux):

où une cellule de client dans l'original a référencé une valeur atomique, la cellule de contre correspondante dans la copie fera référence à la même valeur.Ainsi, les seuls objets référencés en commun par l'arbre d'origine et la copie produite par copie-arborescence sont les chiffres 1-6 et le symbole nil.

Donc, le carnet de couverture rigide est correct.

Autres conseils

Il est légèrement plus compliqué.

Les cellules des inconvénients seront copiées.Généralement, les objets Les références des cellules de contre ne seront pas copiées.

Mais il y a une exception près.Les données telles que Fixnums et les caractères peuvent être stockées en ligne dans des cellules de consex (et des emplacements de structure, des emplacements de classe, des tableaux).Ces types de données ne sont pas nécessairement égalisés.C'est pourquoi il y a EQL.

La description est correcte, l'exemple ne l'est pas. copy-tree renverrait les 1, 2 et 3 tels quels, en copiant uniquement le cons cellules.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top