Renversement

Une autre fonction fondamentale est reverse pour renverser les éléments d'une liste. Comme append, reverse ne modifie pas la liste donnée en argument, mais construit une nouvelle liste contenant les mêmes éléments que l'argument, mais en sens inverse. Exemple :

* (reverse '(a b c))

(C B A)
*

La fonction reverse n'examine pas les éléments de la liste. Si certains de ces éléments sont d'autres listes, celles-ci ne sont pas renversées :

* (reverse '(1 2 (3 (4 5)) (6)))

((6) (3 (4 5)) 2 1)
*

La version destructive de reverse s'appelle nreverse.

Exercice : expliquer la valeur de *l* après l'appel à nreverse :

* (defparameter *l* (list 1 2 3 4))

*L*
* *l*

(1 2 3 4)
* (nreverse *l*)

(4 3 2 1)
* *l*

(1)
*

Les fonctions reverse et nreverse s'appliquent non seulement à des listes, mais aussi à des séquences dont les listes sont un cas particulier. Elles sont donc utilisables sur des vecteurs (voir section 9.1.3) et aussi sur des chaînes de caractères.

La fonction revappend s'applique à deux listes. Elle fait une copie renversée de la première puis la concatène (comme avec nconc) à la deuxième liste. La fonction nreconc est similaire mais renverse la liste comme avec nreverse au lieu d'en faire une copie avant de concaténer.

Irene DURAND
2011-10-14