On rappelle la définition de la procédure map
:
(map proc list1 list2 ...)
Les listi doivent être des listes, et proc doit être une procédure qui accepte autant d'arguments qu'il y a de listi. S'il y a plusieurs listi, elles doivent être toutes de même longueur.
Map applique proc successivement aux éléments de même rang de chacune des listi et rend la liste des résultats, dans l'ordre. Ainsi :
(map + '(1 2 3) '(4 5 6))
=> (5 7 9)
Essayons quelque-chose de plus compliqué :
Nous pouvons imaginer d’utiliser cette combinaison de la façon suivante : décidons de représenter une matrice par la liste de ses lignes, chaque ligne représentée par la liste de ses éléments. Ainsi la matrice A ci-dessous :
sera notée : '((1 2 3) (4 5 6))
Or dans l’exemple ci-dessus l’expression :
(map list '(1 2 3) '(4 5 6))
réalisait exactement la transposition de notre matrice A, à ceci près que dans cette expression chaque ligne est dans une liste isolée au lieu d’être un élément d’une liste de listes. Nous voudrions, pour pouvoir utiliser notre convention de notation pour les matrices, englober ces lignes dans une liste. Comment résoudre ce problème ?
C’est le moment de nous souvenir de la définition de la procédure apply
:
(apply proc arg1 ... args)
Proc doit être une procédure et args doit être une liste.
Apply invoque proc en lui passant comme arguments les éléments de la liste construite par l'expression :
(append (list arg1 ...) args)
ce qui revient à ôter les parenthèses les plus extérieures, ce que nous voulions.
Ce qui nous autorise à construire la procédure diabolique ci-dessous :