Ma

Mappage en Common Lisp

12 exercices

À propos de Mappage

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

Plusieurs tableaux

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

Les autres fonctions de mapping

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 sur d'autres séquences

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 :

  • le premier est le type de la séquence obtenue
  • le second est la fonction à appliquer
  • le troisième et les suivants sont les séquences sur lesquelles opérer.
(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.

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet

Apprends Mappage

L'entraînement est verrouillé

Déverrouille 8 exercices de plus pour t'entraîner sur Mappage