In diesem Kapitel möchte ich zwei Funktionen vorstellen, die für viele Zwecke
sehr gut zu gebrauchen sind.
geht eine Liste durch und wendet
eine lambda-expression auf jedes Listenelement an. In der Ergebnisliste werden
nur die Elemente gesammelt, bei denen die lambda-expression ein True zurückgegeben
hat (also alles andere als nil).
Ein Hinweis: Sollten Probleme im Umgang mit lambda-expressions vorhanden sein,
empfehle ich erst einmal das entsprechende Kapitel zu lesen.
Die Funktion selbst ist nicht kompliziert, hier der Code (die Funktion ist nicht
rekursiv, da sie die Listen nur auf einer Ebene bearbeitet):
(defun whereever(liste expr / )
(apply'append
(mapcar
'(lambda(v / )(if((eval expr)v)(list v)))
liste
)
)
)
Ein Hinweis: In Visual Lisp gibt es neuerdings die Funktionen
(vl-remove-if ...) und (vl-remove-if-not ...), die
genau das tun, was unser (whereever ...) auch macht.
Anwendungsbeispiele:
Reduzieren einer Zahlenliste auf diejenigen Zahlen, die größer als 4 sind:
(whereever
'(5 1 2 7 4 5 3 8)
'(lambda(v)(> v 4))
)
= > (5 7 5 8)
Im nächsten Beispiel werden aus einer Liste mit einzelnen Buchstaben diejenigen
herausgesucht, die kleingeschrieben sind.
(whereever
'("A" "c" "F" "u" "w" "N")
'(lambda(v)(>(ascii v)88))
)
=> ("c" "u" "w")
Und in diesem Beispiel werden aus einer Liste mit Punkten diejenigen herausgefiltert,
deren Z-Wert ungleich 0 ist:
(whereever punkteliste
'(lambda(p)(/=(caddr p)0.0))
)