2009-10-15 8 views
2

Salut J'essaie d'ajouter un élément simple à une liste de lisp. J'ai pensé que le code ci-dessus ajouterait le premier élément de stack1 à queue1. Est-ce que queue1 doit être non nul? Merci.Lisp Appendice ne fonctionne pas correctement

+0

vous devriez vraiment lire un livre d'introduction –

+0

annexant à la fin des listes Lisp est pas une bonne idée –

+0

APPEND retourne une liste qui a les listes d'arguments en annexe - (append list1 liste2 liste3) -> une liste les éléments de list1 et list2 et list3 –

Répondre

4

append rendements la liste concaténée (queue1 avec le premier élément de stack1 en annexe). Il ne modifie pas queue1. L'équivalent destructif de append est nconc: ceci s'ajoute à la liste "en place".

+0

Donc, pour ajouter à une liste je devrais simplement faire (nconc queue1 '4) pour ajouter le numéro 4 à la liste queue1. Aussi, que si nconc est nul, sera-t-il toujours ajouté? Merci –

+0

Oui, (nconc queue1 '4) va recycler queue1. Idiomatiquement, cependant, vous devriez toujours travailler avec la valeur retournée plutôt que de compter sur l'effet secondaire. Désolé, je ne suis pas sûr de ce qui arriverait si vous passiez nil (bien que je suppose que ça ne marcherait pas sur le littéral nul): lancez votre implémentation Lisp et essayez-le je suppose! – itowlson

1

Vous n'avez pas spécifié que Lisp voulez-vous dire, mais en Common Lisp au moins:

  1. APPEND concaténer listes, de sorte que tous ses arguments doit être des listes, pas atomes. Si vous voulez vraiment ajouter un élément à la liste, vous devrez faire (append list1 (list element)). Ce n'est pas une bonne idée parce que dans la plupart des listes de Lisps sont liées simples, et une liste entière devra être traversée pour ajouter à la fin. Habituellement, on ajouterait à l'avant avec CONS, puis inverser la liste une fois terminé, mais cela ne fonctionnera évidemment pas pour les files d'attente.

  2. APPEND ne modifie pas ses arguments. NCONC est une fonction destructive. Alors que je crois que NCONC en particulier est specified pour faire plus ou moins ce que l'on pourrait attendre, la plupart des fonctions destructrices sont autorisées à détruire leurs arguments, à réutiliser leur mémoire, mais ne laissent pas nécessairement de cohérence derrière.

  3. Les listes dans Common Lisp sont implémentées sous la forme de chaînes de contre-cellules ou nil, ce qui signifie que leur comportement a quelques bizarreries relatives à ce dernier. Si vous voulez une liste agissant plus que vous attendez d'autres langues, utilisez une structure de données abstraites. D'autant plus si vous voulez une file d'attente avec ajout constant à la fin. Il existe de nombreuses structures de données impératives disponibles dans le système cl-containers et des structures de données fonctionnelles dans FSet.

Questions connexes