Grep

Grep

Difícil

Introducción

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.

Instrucciones

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:

  1. El string que se debe buscar.
  2. Cero o más opciones para personalizar el comportamiento del comando.
  3. Uno o más ficheros en los que buscar.

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 (':').

Opciones

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.

El proceso de E/S

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.

Lectura de argumentos

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.

Lectura de ficheros

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.

Escritura de la salida

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.

Gestión de errores del sistema

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
    -/
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Lean Exercism

¿Listo para empezar Grep?

Regístrate en Exercism para aprender y dominar Lean con 100 ejercicios y mentoría humana real, todo gratis.