Ich musste eine bestimmte Funktion in so ziemlich jedem Lisp-Programm neu implementieren, das ich je geschrieben habe. Da diese Funktion so nützlich ist, muss sie vorher implementiert worden sein. Ich würde erwarten, dass es gut bekannt ist. Vielleicht ist es Teil der Standardbibliothek von Common Lisp. Wie heißt es und aus welcher Bibliothek stammt es?Standardname für Funktion, die Unterbäume sammelt, die ein Prädikat erfüllen?
(defun unknown-function (predicate tree)
(loop for item in tree
if (funcall predicate item) collect item
else if (listp item) append (unknown-function predicate item)))
Es senkt sich durch einen Baum und schafft eine flache Liste aller Knoten in diesem Baum, der das Prädikat erfüllen.
Normalerweise wird die Aufgabe, die Sie ausführen möchten, gelöst, indem zwei verschiedene Funktionen kombiniert werden: eine, die einen Baum flach macht, und eine andere, die Elemente aus dieser Liste filtert. In Common Lisp gibt es keine flatten Primitive Funktion (aber wenn Sie es googlen finden Sie viele Definitionen, zum Beispiel siehe [this link] (http://stackoverflow.com/questions/2680864/how-to-remove-nested (parentheses-in-lisp)), während für die Filterfunktion remove-if oder remove-if-not verwendet werden kann ([manual] (http://www.lispworks.com/documentation/HyperSpec/Body/f_rm_rm.htm) # remove-if)). – Renzo
'flatten' und' remove-if-not' konnten diese Funktion nicht erzeugen, da das Prädikat Sublisten aus dem Baum auswählen kann, während 'flatten' alle Unterlisten löscht, bevor das Prädikat eine Chance bekommt, sie zu sehen. –