Parcours
/
Common Lisp
Common Lisp
/
Exercices
/
Les longues listes de Leslie
Les longues listes de Leslie

Les longues listes de Leslie

Exercice d'apprentissage

Introduction

Listes

É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".

Créer des listes

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.)

Longueur et accès aléatoire

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 ?

Combiner des listes

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.

Instructions

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 ?

1. Crée une nouvelle liste

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)

2. Ajoute des choses à la liste.

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)

3. Quelles sont les prochaines choses sur la liste ?

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 liste
  • second-thing renvoie le deuxième élément
  • third-thing renvoie le troisième élément
  • twenty-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

4. Retire une chose de la liste

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)

5. Construis de grandes listes à partir de plus petites

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)

6. Combien de temps encore ?

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
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Common Lisp Exercism

Prêt à commencer Les longues listes de Leslie ?

Inscris-toi sur Exercism pour apprendre et maîtriser Common Lisp avec 27 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.