Mapping bezeichnet die Anwendung einer Funktion auf jedes Element einer Sequenz, um eine neue Sequenz zu erzeugen.
Das lässt sich bei einer Liste leicht mit der Funktion mapcar erledigen.
Nehmen wir an, wir haben eine Funktion double, die ihr Argument mit 2 multipliziert:
(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)
Beachte, dass das erste Argument eine Funktion ist, die aufgerufen werden soll. Das #' ist eine spezielle Quoting-Syntax, um eine Funktion anzugeben.
double wurde zuerst mit dem ersten Element aufgerufen, dann mit dem zweiten usw.
Die Ergebnisse wurden in einer Liste gesammelt, die der Wert ist, zu dem der Ausdruck auswertet.
Filtern ist der Prozess, bei dem aus einer Sequenz eine andere Sequenz erstellt wird, indem alle bis auf bestimmte Elemente aus der ursprünglichen Sequenz kopiert werden. Die Auswahl, welche Elemente in die neue Sequenz aufgenommen werden, kann durch eine Prädikatfunktion (eine Funktion, die zu einem booleschen Wert auswertet) oder durch Gleichheit mit einem bestimmten Objekt erfolgen.
remove-if ist eine Funktion, die eine Prädikatfunktion und eine Sequenz als Argumente entgegennimmt und eine Sequenz zurückgibt, die nur die Elemente enthält, für die das Prädikat zu einem falschen Wert auswertete.
Mit anderen Worten: Sie „entfernt“ alle Elemente der Sequenz, für die das Prädikat zu einem wahren Wert auswertet. Beachte jedoch, dass diese Funktion die ursprüngliche Sequenz nicht verändert!
Stattdessen gibt sie eine neue Sequenz ohne die betreffenden Elemente zurück. Wenn das Prädikat für alle Werte wahr war, wird eine leere Sequenz zurückgegeben.
(remove-if #'evenp '(1 2 3 4 5)) ; => (1 3 5)
(remove-if #'oddp '(1 3 5)) ; => ()
Wenn du ein bestimmtes Element aus einer Sequenz entfernen möchtest, kannst du remove verwenden, das das zu entfernende Element und eine Sequenz entgegennimmt.
Alle Werte in der Sequenz, die nicht gleich dem zu entfernenden Element sind, werden zurückgegeben.
Hinweis: Die Gleichheit wird standardmäßig mit dem eql generischen Gleichheitsprädikat geprüft.
(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello") ; => "heo"
Lucy, das Lisp-Alien, mag Zahlen und findet einige davon „großartig“.
Sie bittet dich, ihr zu helfen, Funktionen zu schreiben, mit denen Zahlen großartiger werden.
Was für Lucy eine Zahl großartig macht, kann sich ändern, deshalb müssen die Funktionen flexibel sein.
Um aus einer Liste von Zahlen eine Liste großartigerer Zahlen zu machen, musst du eine Funktion make-magnificent-maybe schreiben, die eine Funktion, die auf die Zahlen angewendet wird, und eine Liste von Zahlen entgegennimmt.
Sie sollte zu einer Liste von Zahlen ausgewertet werden, die (gemäß der übergebenen Funktion) großartiger sind.
(make-magnificent-maybe #'square '(1 2 3)) ; => (1 4 9)
(make-magnificent-maybe #'1+ '(1 2 3)) ; => (2 3 4)
Nachdem Lucy die Zahlen (hoffentlich) großartiger gemacht hat, möchte sie nur noch die Zahlen sehen, die wirklich großartig sind.
Sie weiß ganz sicher, dass 1 niemals großartig ist, also musst du die einfach entfernen.
Aber abgesehen davon ändert Lucy manchmal ihre Meinung, also gibt sie dir wieder eine Funktion, die dir sagt, ob eine Zahl großartig ist oder nicht.
Du musst eine Funktion only-the-best schreiben, die eine Funktion und eine Liste von Zahlen entgegennimmt und nur die besten Zahlen zurückgibt (nicht 1 und keine Zahlen, für die die Funktion wahr ergibt).
(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5)) ; => ()
Melde dich bei Exercism an, um Common Lisp mit 27 Konzepte92 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.