Parcours
/
Common Lisp
Common Lisp
/
Exercices
/
Trie des chaussettes et des sexprs
Trie des chaussettes et des sexprs

Trie des chaussettes et des sexprs

Exercice d'apprentissage

Introduction

Commentaires

Common Lisp permet au programmeur d'écrire des «\u00A0commentaires\u00A0» qui sont ignorés par l'ordinateur. Les commentaires sur une seule ligne commencent par un ou plusieurs points-virgules (;) et, parfois, on peut voir ce qui suit\u00A0:

(code...) ; => value

Où le commentaire est utilisé pour indiquer quelle valeur est renvoyée par Common Lisp après l'exécution du code sur cette ligne.

Il est idiomatique d'utiliser un seul point-virgule pour un commentaire court à la fin d'une ligne, deux pour un commentaire plus long au-dessus d'une section de code, trois pour un long commentaire décrivant quelque chose comme une fonction, et quatre pour un commentaire tel qu'un en-tête en haut d'un fichier source.

Cons

Tous les objets Common Lisp sont soit des «\u00A0atomes\u00A0» (des valeurs uniques et indivisibles), soit des «\u00A0cons\u00A0» (construits par la fonction de construction cons). Un cons est composé de deux parties\u00A0: le premier élément et le reste des éléments. Pour des raisons historiques, ces deux parties sont appelées le car et le cdr. Lorsque ces cons sont évalués comme du code, le premier élément (car) représente la fonction appelée, tandis que le reste des éléments (cdr) représentent les arguments de cette fonction\u00A0:

(<function> <arg1> <arg2> ... <argN>)
; ^ car ^  |        ^ cdr ^

Expressions

Tout le code Common Lisp est constitué de S-Expressions (Expressions symboliques). On les appelle sexprs en abrégé. Chaque sexpr est soit un atome, soit un cons. Lorsque les S-Expressions sont évaluées, elles renvoient automatiquement une valeur qui prend la place de l'expression. Lorsque tu écris tes propres fonctions (en utilisant defun), la dernière valeur dans le corps du defun est automatiquement renvoyée\u00A0:

;; Defining a new function
(defun gimme-foo () 'foo)
;; Calling the function as an S-Expression
(gimme-foo) ; => FOO

Symboles

Les symboles en Common Lisp sont des valeurs spéciales qui peuvent pointer vers d'autres valeurs ou, dans le cas des mots-clés, vers eux-mêmes. Lorsque les symboles sont évalués par Lisp, ils sont remplacés par les valeurs vers lesquelles ils pointent\u00A0:

foo  ; => <whatever-foo-points-to>
:foo ; => :FOO

Note que les mots-clés sont désignés par un deux-points (:) initial.

La citation (l'ajout de ' devant une S-expression) indique à Lisp de ne pas évaluer cette expression. En citant 'foo dans notre exemple de defun, on a évité que Lisp tente de chercher (et échoue à trouver) ce vers quoi FOO était censé pointer, et on a renvoyé à la place la valeur FOO elle-même. Si FOO n'a été défini nulle part dans notre programme\u00A0:

foo  ; => <ERROR! Lisp doesn't know what foo points to!>
'foo ; => FOO

Pour l'instant, tu peux considérer cela simplement comme un moyen de renvoyer des symboles depuis une fonction, mais on reviendra sur la citation et on explorera davantage ses implications dans de futurs exercices d'apprentissage.

Instructions

Toi ! Oui, toi, brave lisper ! Lenny l'alien lisp a besoin de ton aide ! Lenny veut aller retrouver tous les autres aliens lisp, mais ses parents ont dit : pas de sortie tant que la chambre n'est pas rangée.

Le problème, c'est que Lenny voit à peine le sol ! Lenny n'arrive pas à distinguer les atomes des conses, les symboles des mots-clés, les car des cdr !

Tu peux aider Lenny à ranger tout ce bazar ? N'oublie pas tes parenthèses, tu vas en avoir besoin !

1. Rafraîchis la mémoire de Lenny sur les symboles

Avant de commencer, Lenny a besoin d'un rappel sur l'allure des symboles et des mots-clés : ça fait un moment que la chambre n'a pas été rangée... Aide Lenny en définissant deux fonctions : lennys-favorite-food, qui s'évalue en un symbole, et lennys-secret-keyword, qui s'évalue en un mot-clé. Par exemple :

(lennys-favorite-food) ; => LASAGNA
(lennys-secret-keyword) ; => :ALIENS-ARE-REAL

Note que tu peux renvoyer le symbole ou le mot-clé que tu veux (si tu n'es pas fan de lasagnes ou si tu ne crois pas aux aliens).

2. Aide Lenny à distinguer les atomes des conses

Une fois que Lenny a revu les symboles et les mots-clés, il est temps de ranger ! Pour trier toutes les S-Expressions qui traînent dans la chambre, Lenny a besoin d'aide pour déterminer ce qui est un cons et ce qui est un atome. Tu peux l'aider en implémentant deux fonctions, is-an-atom-p et is-a-cons-p :

(is-an-atom-p 'one-thing)    ; => T
(is-an-atom-p '(two things)) ; => NIL
(is-a-cons-p 'one-thing)    ; => NIL
(is-a-cons-p '(two things)) ; => T

Pour cette section, plusieurs fonctions natives de Lisp pourraient t'être utiles. De plus, pour l'instant, tu peux simplement considérer T comme vrai et NIL comme faux.

3. Aide Lenny à découper ses conses

Enfin, les conses de Lenny sont trop volumineux pour être rangés proprement, il faut donc les découper en morceaux plus petits. Peux-tu aider en définissant deux fonctions supplémentaires pour découper ses conses (first-thing et rest-of-it) ?

(first-thing '(first second third)) ; => FIRST
(rest-of-it  '(first second third)) ; => (SECOND THIRD)

Là encore, certaines fonctions natives de Common Lisp pourraient t'être utiles.

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Common Lisp Exercism

Prêt à commencer Trie des chaussettes et des sexprs ?

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