Étant donné que le nom du langage que l'on utilise, Lisp, signifie LIST Processing, on pourrait penser que le langage dispose d'outils pour manipuler des listes d'éléments, et on aurait raison !
Bien que Common Lisp possède d'autres structures de données que les listes, les listes restent très utilisées.
Une liste en Common Lisp est une séquence d'éléments. On l'appelle aussi un cons (pour des raisons historiques, surtout).
Les éléments eux-mêmes n'ont pas besoin d'être du même type.
Par exemple, on peut avoir une liste contenant 1, two et "III".
On peut simplement saisir une liste avec une citation, comme ceci : '(1 two "III"), ce qui crée une liste et l'évalue (elle s'évalue en (1 two "III")).
Il existe aussi deux fonctions principales pour créer des listes : list et cons.
list prend zéro argument ou plus et s'évalue en une liste créée avec ces valeurs :
(list 1 'two "III") ; => (1 two "III")
cons prend deux éléments et crée une liste dont le premier élément est son car (la tête de la liste) et le second son cdr (le reste de la liste) :
(cons 1 2) ; => (1 . 2) ;; (a list without `nil` as its `cdr` is printed in this way)
(cons 1 nil) ; => (1)
(cons 1 (cons 2 nil)) ; => (1 2)
Les fonctions car et cdr permettent d'accéder au car et au cdr d'une liste.
(first et rest sont des synonymes de car et cdr et fonctionnent exactement de la même façon.)
La longueur d'une liste peut être déterminée avec length.
Une liste vide a une longueur nulle.
On peut accéder à un élément quelconque avec nth (à noter que les indices des listes commencent à zéro).
Demander un indice plus grand que la longueur de la liste n'est pas une erreur.
À la place, cela s'évalue en nil :
(nth 23 '(short list)) ; => nil
Il existe aussi plusieurs méthodes utilitaires pour accéder aux premiers éléments d'une liste : first, second, third, et ainsi de suite jusqu'à tenth. Astucieux, non ?
On peut combiner deux listes ou plus avec append :
(append '(a b c) '(1 2 3)) ; => (A B C 1 2 3)
(append '(a b c) '()) ; => (A B C)
Chaque argument passé à append doit être une liste.
Leslie, l'extraterrestre Lisp, a des courses à faire. Il est très important d'avoir une liste de courses. On doit pouvoir y ajouter des choses, et en retirer d'autres.
Bien sûr, un simple stylo et du papier ne suffisent pas pour un extraterrestre Lisp. Le mot List constitue d'ailleurs la majeure partie du mot Lisp ! Il faut donc écrire quelques fonctions pour aider à suivre les courses.
Peux-tu aider Leslie à suivre la liste de courses ?
Pour commencer, Leslie doit créer une liste vide. Une fonction appelée new-list serait parfaite pour ça.
(new-list) ; => ()
Oh non... Leslie a déjà quelques choses en tête, il leur faut donc une fonction qui prend trois éléments (heureusement, Leslie ne crée que des listes de trois éléments. Ni plus, ni moins !) et qui crée une nouvelle liste de courses avec ces éléments. Écris une fonction list-of-things qui prend trois éléments et renvoie une liste de ces éléments.
(list-of-things 'bread 'milk 'butter) ; => '(bread milk butter)
Avant d'aller au magasin, Leslie regarde dans le garde-manger pour voir ce qu'il leur faut. Aide Leslie en écrivant la fonction add-to-list, qui ajoute un élément au début d'une liste.
(add-to-list 'butter '(bread)) ; => '(butter bread)
Pendant les courses, Leslie veut savoir quoi chercher ensuite. Leslie aime aussi regarder plus loin dans la liste pour voir le deuxième, le troisième, ou même le 23e élément (le nombre porte-bonheur de Leslie).
first-thing renvoie le premier élément de la listesecond-thing renvoie le deuxième élémentthird-thing renvoie le troisième élémenttwenty-third-thing renvoie le vingt-troisième élément(first-thing '(bread butter milk)) ; => 'bread
(second-thing '(bread butter milk)) ; => 'butter
(third-thing '(bread butter milk)) ; => 'milk
Leslie veut trouver le premier élément de la liste et le retirer de l'étagère. Aide Leslie en écrivant une fonction remove-first-item qui renvoie une liste contenant tout sauf le premier élément de la liste d'entrée.
(remove-first-item '(bread butter milk)) ; => '(butter milk)
Leslie vient de s'apercevoir que deux listes de courses ont été créées par accident, au lieu d'une seule ! Écris une fonction list-append qui renvoie une liste composée des éléments de la première liste suivis de ceux de la seconde.
(list-append '(bread salt) '(butter milk)) ; => '(bread salt butter milk)
Leslie commence à s'inquiéter : les courses risquent de prendre du temps. Mais combien y a-t-il de choses sur cette liste ? Écris une fonction just-how-long qui lui indique la longueur de la liste.
(just-how-long '(bread milk butter salt)) ; => 4
Inscris-toi sur Exercism pour apprendre et maîtriser Common Lisp avec 27 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.