was ist der typische Weg, um ein Element am Ende der Liste?
Habe ich eine Liste (1 2 3), und hinzufügen möchten, 4 (wo 4 ist das Ergebnis einer Auswertung (+ 2 2))
(setf nlist '(1 2 3))
(append nlist (+ 2 2))
Diese besagt, dass append erwartet eine Liste, nicht eine Zahl. Wie würde ich dies bewerkstelligen?
InformationsquelleAutor r b | 2011-06-22
Könnten Sie Anhängen, aber Vorsicht, dass es kann dazu führen, schlechte Leistung, wenn Sie in einer Schleife oder auf sehr langen Listen.
Wenn die Leistung wichtig ist, das übliche idiom ist der Aufbau von Listen durch voranstellen von (mit Nachteile), dann reverse (oder nreverse).
In der Regel, consing und Umkehr in Ordnung ist. Wenn Sie viele lange Listen, und die Umkehrung wird ein performance-problem, verwenden Sie eine andere Datenstruktur oder halten Sie einen Zeiger an das Ende der Liste manuell auswählen. (Es gibt ein paar Vorschläge in den anderen Antworten.)
InformationsquelleAutor danlei
Du noch nicht angegeben, die Art von Lisp, also, wenn Sie Emacs-Lisp-und
Strich
list manipulation-Bibliothek, es hat eine Funktion-snoc
, liefert eine neue Liste mit dem element am Ende Hinzugefügt. Der name ist Umgekehrt "Nachteile".InformationsquelleAutor Mirzhan Irkegulov
Wenn die "Nachteile an der front, beenden Sie, indem Sie umkehren" idiom ist nicht für Sie geeignet (wenn Sie. zum Beispiel müssen übergeben Sie die Liste auf, um andere Funktionen WÄHREND der Erstellung), es gibt auch die "keep track of the end" - trick. Jedoch, es ist wahrscheinlich sauberer zu bauen, die Liste von consing auf der Vorderseite, dann beenden Sie, indem Sie mit dem reverse-oder nreverse, bevor Sie schließlich mit.
Im wesentlichen, dies ermöglicht es Ihnen, die Liste in der richtigen Reihenfolge, während das Gebäude, die Kosten müssen im Auge behalten.
Dies gibt die folgende Ausgabe:
(cons list last_cons_cell)
und spezielle Funktionen verwenden die es für die Zugabe am Ende wie(defun eadd (elt ls) (rplacd (cdr ls) (list elt)) (rplacd ls (cddr ls)) ls)
etc.InformationsquelleAutor Vatine
Können Sie auch
nconc
erstellen der Liste, das ist wie append, nur es ändert sich die Struktur der input-Listen.Wohl besser nicht zu empfehlen
NCONC
für einen Anfänger überhaupt.Nie, NIE verwenden, NCONC. Die side-Effekt wird kommen, beißen Sie in den Arsch. Und es ist auch nicht asymptotisch weniger Komplex als APPEND.
Nie, nie, niemals machen absolute Aussagen.
InformationsquelleAutor Trey Jackson
Diese Funktion könnte in manchen Situationen nützlich sein, es transparent hängt ein einzelnes element an eine Liste, D. H. es ändert sich die Liste aber gibt die angefügte element (eingeschlossen in eine Liste):
Nein, es ist Verschieden von NCONC; mit diesem ATTACH1 Funktion brauchen Sie nicht (und dürfen Sie nicht) schließen Sie das element Hinzugefügt werden, in eine Liste.
(setf (cdr (last Liste)) (cons x nil)) = (nconc lst (cons x nil)) = (nconc lst (list x))
Wir haben unterschiedliche Vorstellungen von "ähnlich". Für mich zwei Funktionen, die unterschiedliche Art der Argumente (atom vs. Liste) sind nicht ähnlich, während Sie für Sie. Sowieso, unabhängig von der Einbringung in eine Liste, die element Anhängen, ich Stimme mit Ihnen überein.
InformationsquelleAutor mmj
Nachteile-ing an das Ende einer Liste erreicht werden kann mit dieser Funktion:
copy-list
-, die zweite mitlast
. Besser zu ändern, dietrack-trail
von Vatine Antwort.InformationsquelleAutor mmj
Wenn Sie versuchen, fügen Sie zwei Listen zum Beispiel
(1 2 3) + (1 2 3)
hier ist der code (rekursiv)Wenn Sie versuchen, hinzufügen, ein Element am Ende der zweiten Liste, zum Beispiel
3 + (1 2 3)
InformationsquelleAutor Giri
(append l (list e)) ; e ist das element, das Sie hinzufügen möchten, in den Schwanz der Liste
InformationsquelleAutor Nadhem Jemmali
Wenn Sie ein Element hinzufügen möchten, auf das Ende einer Liste ohne änderung dieser Liste, dann wie bereits vorgeschlagen, können Sie eine Funktion verwenden, wie
Diese gibt eine neue, erweiterte Liste, wobei die input-Liste. Allerdings, wenn Sie möchten, ändern Sie die input-Liste, um das hinzugefügte Element, dann können Sie ein makro verwenden, wie
Pushend wirkt wie push, sondern "schiebt" das Element wird an das Ende der übergebenen Liste. Beachten Sie auch die Reihenfolge der Argumente ist das Gegenteil von push.
InformationsquelleAutor davypough