Site WWW de Laurent Bloch
Slogan du site

ISSN 2271-3905
Cliquez ici si vous voulez visiter mon autre site, orienté vers des sujets moins techniques.

Pour recevoir (au plus une fois par semaine) les nouveautés de ce site, indiquez ici votre adresse électronique :

Un tour de passe-passe ?
Transposition de matrice en une ligne
Article mis en ligne le 22 février 2007
dernière modification le 21 novembre 2008

par Laurent Bloch

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 :