Le mapping désigne l'application d'une fonction à chaque élément d'une séquence, afin de produire une nouvelle séquence.
On peut utiliser mapcar pour appliquer une fonction à un tableau d'objets
(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)
On remarque que le premier argument est une fonction à appeler.
Le #' est une syntaxe de citation spéciale qui permet de désigner une fonction.
(On peut utiliser 'double ici, mais l'usage de #' est idiomatique et sans doute « plus correct ».)
Le mapping ne se limite pas à appliquer une fonction à une seule séquence : on peut aussi le faire avec plusieurs séquences.
Si l'on fournit N séquences, la fonction doit prendre N arguments.
(mapcar #'list '(1 2) '(a b) '("foo" "bar")) ; => ((1 a "foo") (2 b "bar"))
Outre mapcar, il existe d'autres fonctions pour appliquer une fonction aux éléments d'un tableau.
mapcar est assurément la plus courante, mais il est bon de connaître les autres.
maplist fonctionne comme mapcar, mais elle agit sur des sous-tableaux successifs plutôt que sur les éléments.
D'abord sur le tableau entier, puis sur le cdr, puis sur le cdr de celui-ci, etc. :
(maplist #'identity '(a b c)) ; => ((A B C) (B C) (C))
mapc et mapl sont respectivement l'équivalent de mapcar et de maplist, mais elles ne collectent pas les résultats et renvoient le premier tableau à la place.
On les utilise pour des opérations à effet de bord.
mapcan et mapcon sont l'équivalent de mapcar et de maplist, mais le résultat est aplati par nconc, qui est comme append mais destructeur pour tous ses arguments sauf le dernier.
Le mapping ne se limite pas aux tableaux. N'importe quelle séquence (abordée dans un autre concept) peut faire l'objet d'un mapping.
Pour les séquences qui ne sont pas des tableaux, on utilise la fonction map.
map prend 3 arguments ou plus :
(map 'list #'double '(1 2 3)) ; => (2 4 6)
(map 'string #'char-upcase "foobar") ; => "FOOBAR"
Cas particulier : si l'on fournit nil comme type de séquence résultante, alors nil est renvoyé.
Comme mapc et mapl plus haut, cela sert à produire des effets de bord.