Les listes sont ce que l'on nomme une
structure de
données. C'est la structure de données historique de Lisp (Lisp a
même été inventé autour de cette notion par John McCarthy en 1958 au
MIT (le fameux
Massachussetts Institute of Technology) et le
nom de Lisp signifie
List Processor: le manipulateur de
listes). Les listes sont toujours une structure de données importante
pour Scheme, le successeur de Lisp.
Une structure de données est une façon d'agréger des valeurs. Il en
existe d'autres comme le vecteur ou la table de hachage. Les
structures de données ont toutes des qualités qui les font préférer
pour certains emplois spécifiques. Les listes sont une structure de
données
composites puiqu'elles permettent de rassembler en
une unique valeur une succession ordonnée non bornée de valeurs. Une
liste peut être étendue simplement pour contenir de nouveaux éléments,
on peut également (mais plus coûteusement) en retirer. L'accès aux
éléments d'une liste est souvent linéaire car il faut parcourir une
liste pour en extraire un terme.
Les listes que nous manipulerons dans ce cours sont typées: elles ne
peuvent contenir que des valeurs ayant toutes la même nature. On dit
qu'elles sont
homogènes. On pourra donc construire des
listes de nombres, des listes d'images, des listes de listes de
chaînes de caractères ou des listes de fonction prenant un entier et
renvoyant une image, etc. On notera par
LISTE[t] le type
d'une liste dont les éléments ont le type
t. Ainsi les
listes précédemment mentionnées auront-elles pour types:
LISTE[Nombre]
LISTE[Image]
LISTE[LISTE[string]]
LISTE[int -> Image]
Tout type de données se caractérise par l'existence de trois sortes de
fonctions:
-
des constructeurs qui permettent de construire ces données,
- des accesseurs ou sélecteurs qui permettent
d'extraire des informations de ces données,
- des reconnaisseurs qui savent reconnaître ces données
(ou des sous-ensembles de ces données) parmi d'autres.
nat)
comme construits à partir de la constante zéro et de la fonction
successeur qui prend un entier naturel n et retourne son suivant
(l'entier n+1). Les fonctions telles que l'addition ou la
multiplication sont aussi des constructeurs. Il n'y a pas d'accesseur
pour les nombres puisque le nombre est sa propre information: un
nombre n'est pas une information composite. En revanche, le prédicat
number? est un reconnaisseur tout comme positive? ou
encore odd?. Reconnaissons toutefois que cette vue est un peu
... limite.