Ma

Mapping in Common Lisp

12 Übungen

Über Mapping

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“.)

Mehr als eine Liste

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"))

Weitere Map-Funktionen

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 auf anderen Sequenzen

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:

  • Das erste ist der Typ der resultierenden Sequenz.
  • Das zweite ist die Funktion, die angewendet werden soll.
  • Das dritte und die weiteren sind die Sequenzen, auf denen gearbeitet wird.
(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.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Mapping

Das Üben ist gesperrt

Schalte 8 weitere Übungen frei, um Mapping zu üben