Tu as décroché un emploi dans une bibliothèque locale, où tu aides à organiser sa collection de vieux livres. Les étudiants qui la fréquentent sont souvent à la recherche de citations dont ils ne se souviennent qu'à moitié, pour les citer dans leurs travaux universitaires. Plutôt que de lire chaque livre manuellement, de la première à la dernière page, tu décides de construire un petit outil qui les parcourt à la recherche de ces extraits de citations.
Recherche dans des fichiers les lignes qui correspondent à une chaîne recherchée et renvoie toutes les lignes correspondantes.
La commande Unix grep recherche dans des fichiers les lignes qui correspondent à une expression régulière.
Ta tâche consiste à implémenter une version simplifiée de la commande grep, qui prend en charge la recherche de chaînes fixes.
La commande grep prend trois arguments :
Elle lit ensuite le contenu des fichiers indiqués (dans l'ordre indiqué), trouve les lignes qui contiennent la chaîne recherchée, puis renvoie enfin ces lignes dans l'ordre dans lequel elles ont été trouvées. Lors d'une recherche dans plusieurs fichiers, chaque ligne correspondante est précédée du nom du fichier et d'un deux-points (':').
La commande grep prend en charge les options suivantes :
-n Fait précéder chaque ligne de la sortie du numéro de ligne et d'un deux-points (':'), en plaçant le numéro après le nom du fichier (s'il est présent).-l Affiche uniquement les noms des fichiers qui contiennent au moins une ligne correspondante.-i Effectue la correspondance sans tenir compte de la casse.-v Inverse le programme : recueille toutes les lignes qui ne correspondent pas.-x Recherche uniquement les lignes pour lesquelles la chaîne recherchée correspond à la ligne entière.Contrairement aux autres exercices, grep doit interagir avec le « monde extérieur » : lire des fichiers, gérer des erreurs système et écrire sur stdout.
En Lean, l'interaction avec le système se fait généralement dans la monade IO, ce qui permet aux effets de bord de se produire dans un environnement confiné sans affecter l'état pur de la plupart des autres fonctions.
Lean permet d'appeler un fichier comme un script, soit directement comme script autonome avec lean --run, soit avec lake.
Un projet Lean a un seul point d'entrée, une fonction appelée main, qui prend une List String contenant tous les arguments qui lui sont passés.
Pour simuler l'exécution de Grep.lean comme un exécutable, les arguments sont passés de la même façon dans cet exercice.
Lean offre des fonctions pour manipuler des fichiers dans la monade IO.FS.
Par exemple, IO.FS.readFile permet de lire le contenu d'un fichier à un chemin donné, sous la forme d'une String.
Plutôt que de renvoyer une valeur, cet exercice exige que les résultats soient écrits sur la sortie standard ou sur l'erreur standard. Lean fournit des fonctions pour cela.
Contrairement aux erreurs dans Except, les exceptions IO sont de véritables exceptions à l'exécution.
Tu peux utiliser try/catch pour les gérer :
try
/-
code that may possibly raise an exception
-/
catch msg =>
/-
code that is executed only if an exception was thrown
-/
Inscris-toi sur Exercism pour apprendre et maîtriser Lean avec 100 exercices, et un vrai mentorat humain, le tout gratuitement.