Question

J'ai une classe de nœud qui a une fente « élément » qui contient une liste avec des numéros et une lettre, par exemple:

'(1 2 3 4 5 6 b)


(defclass node ()
  ((element :reader get-element
            :writer set-element
            :initform '()
            :initarg :element
            :documentation "The element"))

Une partie du programme est censé prendre la fente « élément », remplacez la lettre avec l'un des numéros et enfin créer un nouvel objet de nœud avec la liste swappés son emplacement « élément ». J'ai déjà une fonction d'échange qui reçoit une liste et deux membres de cette liste et en utilisant la fonction rotatef il les swaps.

Pour vérifier que la fonction d'échange travaillait j'ai créé la pièce de code suivante qui stocke une variable temporaire et l'élément swaps la lettre « b » avec un numéro dans la liste:


(setf root (make-instance 'node))
(set-element '(1 2 3 b 4 5 6 7 8) root)

(setf temp (get-element root)) (swap temp 'b 4)

Le problème est que la fente « élément » de l'objet racine est échangé en même temps que temporaire. Étrangement j'ai essayé de changer la fonction d'échange pour inverser et ne modifie pas l'un des deux.

Je ne sais pas s'il y a un moyen d'assigner une fente à une variable ou un moyen d'éviter ce qui précède ne se produise.

Merci.

Était-ce utile?

La solution

Reverse crée et retourne une nouvelle liste. Rotatef (comme setf, incf etc.) modifier un lieu. Vous devrez copy-list ou copy-tree votre element pour créer une nouvelle liste que vous modifiez ensuite.

Autres conseils

Quelques autres remarques:

  • à la place d'un procédé de lecture et de définition, utilisent une méthode d'accès. C'est généralement préféré.

  • Les listes sont créées avec des fonctions telles que LIST ou COPY-LIST. Une liste écrite comme « (1 b 2) est dans le code source d'une constante littérale et ne doit pas être modifié. Il est pas défini dans la norme CL ce qui se passe si vous essayez de modifier une liste littérale. Cela peut avoir des effets indésirables. Si vous avez une liste littérale et que vous voulez modifier, vous devez d'abord copier avec COPIE-LIST (ou copier-TREE) et modifier cette copie.

  • vous devez également apprendre la différence entre les opérations non destructrices comme REVERSE et éventuellement des opérations destructrices comme NREVERSE. Si vous voulez la liste initiale soit inchangée, utiliser des opérations non destructrices. La nature des opérations de liste ou séquence est décrite dans le Common Lisp hyperspec pour chaque opération.

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