Wie entfernen, verschachtelte Klammern in LISP
Wie kann ich entfernen, verschachtelte Klammern rekursiv in Common LISP wie
(unnest '(a b c (d e) ((f) g))) => (a b c d e f g)
(unnest '(a b)) => (a b)
(unnest '(() ((((a)))) ())) => (a)
Dank
InformationsquelleAutor der Frage bubdada | 2010-04-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, was ich tun würde:
Das funktioniert vor allem, weil ich Quicklisp bereits installiert.
InformationsquelleAutor der Antwort Xach
InformationsquelleAutor der Antwort Donnie Cameron
InformationsquelleAutor der Antwort Bill
Ich weiß, dies ist ein Alter thread, aber es ist einer der ersten, der kommt, wenn ich google lisp glätten. Die Lösung, die ich entdeckt, ist ähnlich dem, der oben diskutiert wird, aber die Formatierung ist etwas anders. Ich werde erklären, dass es, wenn man neue lisp, wie ich war, als ich das erste mal gegoogelt, diese Frage, so ist es wahrscheinlich, dass andere es auch sein.
Für diejenigen, lisp, dies ist eine kurze Zusammenfassung.
Die folgende Zeile deklariert eine Funktion, die aufgerufen reduzieren, mit dem argument L.
In der Zeile darunter Prüfungen für eine leere Liste.
Die nächste Zeile, wird nil zurückgegeben, weil die Nachteile ATOM nil deklariert eine Liste mit einem Eintrag (ATOM). Dies ist der basisfall der Rekursion und können die Funktion wissen, Wann man aufhören. Die Linie, nachdem dieser überprüft, ob das erste Element in der Liste ist ein atom, anstatt einer anderen Liste.
Dann, wenn es ist, es verwendet die Rekursion zu erstellen flachgedrückten-Liste dieses atom in Kombination mit dem rest der reduzierten Liste, die der Funktion generiert. Nachteile verbindet sich ein atom mit einer anderen Liste.
Wenn es nicht ein atom, dann müssen wir reduzieren, denn es ist eine andere Liste, können weitere Listen innerhalb von es.
Der append-Funktion append die erste Liste an den Anfang der zweiten Liste.
Beachten Sie auch, dass jedes mal, wenn Sie eine Funktion in lisp, müssen Sie umgeben Sie es mit Klammern. Dies verwirrte mich zunächst.
InformationsquelleAutor der Antwort Chantry Cargill
Können Sie definieren, wie diese zum Beispiel:
InformationsquelleAutor der Antwort Jakob
Lisp hat die Funktion
remove
Dinge zu entfernen. Hier verwende ich eine versionREMOVE-IF
entfernt werden, jeden Artikel, für die ein Prädikat wahr ist. Ich testen, ob das Ding eine Klammer, und entfernen Sie es, wenn wahr.Wenn Sie möchten, entfernen von Klammern finden Sie diese Funktion:
Hinweis, obwohl, wie Svante erwähnt, in der Regel nicht 'entfernen' Klammern.
InformationsquelleAutor der Antwort Rainer Joswig
Dies ist ein Akku-basierten Ansatz. Die lokale Funktion %reduzieren hält ein Akku der Schwanz (die Recht Teil der Liste bereits reduziert). Wenn das Teil noch zu flach (die Links Teil der Liste) leer ist, gibt es die Rute. Wenn das Teil zu glätten, ist eine nicht-Liste, gibt es das Teil vorangestellt, auf den Schwanz. Wenn der Teil, der abgeflacht ist, eine Liste, es flacht die rest von der Liste (mit der aktuellen Rute), dann verwendet das Ergebnis als der Schwanz für die Abflachung der erste Teil der Liste.
InformationsquelleAutor der Antwort Joshua Taylor
Ich weiß, diese Frage ist wirklich altaber ich bemerkte, dass niemand verwendet das push/nreverse idiom, also bin ich auch hochladen, hier.
die Funktion
reverse-atomize
nimmt jedes "atom" und stellt es in dieoutput
auf den nächsten Anruf. Am Ende erzeugt es eine vereinfachte Liste, das ist Rückschritt, das ist behoben, mit dernreverse
Funktion in deratomize
Funktion.So aufrufen
atomize '((a b) (c) d)
sieht wie folgt aus:Und wenn Sie rufen
reverse-atomize
mitreverse-atomize '((a b) (c) d)
dieses auftreten würde:Menschen wie die Verwendung von Funktionen wie
push
nreverse
undnconc
weil Sie weniger RAM als Ihre jeweiligencons
reverse
undappend
Funktionen. Das sagte die Doppel-rekursive Natur desreverse-atomize
kommt mit seinen eigenen RAMifications.InformationsquelleAutor der Antwort Spenser Truex
InformationsquelleAutor der Antwort Bernard Adrian