Has aceptado un trabajo en una biblioteca local para ayudar a organizar su colección de libros antiguos. Los estudiantes que acuden a ella suelen andar buscando citas que recuerdan a medias para incluirlas en sus trabajos de fin de curso. En lugar de leer a mano cada libro de principio a fin, decides crear una pequeña herramienta que los examine en busca de esas citas parciales.
Busca en los ficheros las líneas que coincidan con un string de búsqueda y devuelve todas las líneas coincidentes.
El comando grep de Unix busca en los ficheros las líneas que coincidan con una expresión regular.
Tu tarea es implementar una versión simplificada del comando grep, que permite buscar strings fijos.
El comando grep acepta tres argumentos:
A continuación, lee el contenido de los ficheros indicados (en el orden indicado), encuentra las líneas que contienen el string de búsqueda y, por último, devuelve esas líneas en el orden en que se encontraron. Cuando se busca en varios ficheros, cada línea coincidente va precedida por el nombre del fichero y dos puntos (':').
El comando grep admite las siguientes opciones:
-n Antepone el número de línea y dos puntos (':') a cada línea de la salida, colocando el número después del nombre del fichero (si lo hay).-l Muestra solo los nombres de los ficheros que contienen al menos una línea coincidente.-i Compara sin distinguir entre mayúsculas y minúsculas.-v Invierte el programa: recoge todas las líneas que no coincidan.-x Busca solo las líneas en las que el string de búsqueda coincide con la línea completa.A diferencia de otros ejercicios, grep requiere interactuar con el «mundo externo»: leer ficheros, gestionar errores del sistema e imprimir en stdout.
En Lean, la interacción con el sistema suele hacerse en la mónada IO, que permite que ocurran efectos secundarios en un entorno contenido sin afectar al estado puro de la mayoría de las demás funciones.
Lean permite que se llame a un fichero como script, ya sea directamente como script independiente mediante lean --run o con el uso de lake.
Un proyecto Lean tiene un único punto de entrada, una función llamada main, que recibe un List String con todos los argumentos que se le pasan. Para simular la ejecución de Grep.lean como un ejecutable, en este ejercicio los argumentos se pasan de la misma forma.
Lean ofrece funciones para manipular ficheros en la mónada IO.FS. Por ejemplo, IO.FS.readFile puede usarse para leer el contenido de un fichero de una ruta dada como un String.
En lugar de devolver un valor, este ejercicio requiere que los resultados se escriban en la salida estándar o en la salida de error. Lean tiene funciones para este fin.
A diferencia de los errores en Except, las excepciones de IO son realmente excepciones en tiempo de ejecución. Puedes usar try/catch para gestionarlas:
try
/-
code that may possibly raise an exception
-/
catch msg =>
/-
code that is executed only if an exception was thrown
-/
Regístrate en Exercism para aprender y dominar Lean con 100 ejercicios y mentoría humana real, todo gratis.