Beim Mapping wendest du eine Funktion auf jedes Element einer Sequenz an, um eine neue Sequenz zu erzeugen.
Mit mapcar kannst du eine Funktion auf eine Liste von Objekten anwenden.
(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, mit der du eine Funktion angibst.
(Du kannst hier 'double verwenden, aber die Verwendung von #' ist idiomatisch und wohl „korrekter“.)
Mapping ist nicht darauf beschränkt, eine Funktion auf eine einzelne Sequenz anzuwenden, sondern kann mit mehreren Sequenzen durchgeführt werden.
Wenn N Sequenzen angegeben werden, muss die Funktion N Argumente annehmen.
(mapcar #'list '(1 2) '(a b) '("foo" "bar")) ; => ((1 a "foo") (2 b "bar"))
Neben mapcar gibt es weitere Funktionen, mit denen du über Listen mappen kannst.
mapcar ist definitiv die häufigste, aber es ist gut, die anderen zu kennen.
maplist funktioniert ähnlich wie mapcar, arbeitet aber mit aufeinanderfolgenden Teillisten statt mit Elementen.
Zuerst auf die gesamte Liste, dann auf cdr, dann auf das cdr davon usw.:
(maplist #'identity '(a b c)) ; => ((A B C) (B C) (C))
mapc und mapl sind wie mapcar bzw. maplist, aber sie sammeln die Ergebnisse nicht, sondern geben die erste Liste zurück.
Das wird für Operationen mit Seiteneffekten verwendet.
mapcan und mapcon sind wie mapcar und maplist, aber das Ergebnis wird mit nconc flach gemacht, das wie append ist, aber alle Argumente außer seinem letzten destruktiv verändert.
Mapping ist nicht auf Listen beschränkt. Jede Sequenz (wird in einem anderen Konzept behandelt) kannst du mappen.
Bei Sequenzen, die keine Listen sind, verwendest du die Funktion map.
map nimmt 3 oder mehr Argumente entgegen:
(map 'list #'double '(1 2 3)) ; => (2 4 6)
(map 'string #'char-upcase "foobar") ; => "FOOBAR"
Als Sonderfall: Wenn du nil als Typ der resultierenden Sequenz angibst, gibt map nil zurück.
Das wird (wie mapc und mapl oben) für Seiteneffekte verwendet.