Hai trovato lavoro in una biblioteca locale, dove aiuti a organizzare la collezione di libri antichi. Gli studenti che la frequentano sono spesso a caccia di citazioni ricordate a metà, da inserire nelle loro tesine. Invece di leggere a mano ogni libro da cima a fondo, decidi di costruire un piccolo strumento che li analizzi, cercando proprio queste citazioni parziali.
Cerca nei file le righe che corrispondono a una stringa di ricerca e restituisci tutte le righe corrispondenti.
Il comando Unix grep cerca nei file le righe che corrispondono a un'espressione regolare. Il tuo compito è implementare una versione semplificata del comando grep, che supporta la ricerca di stringhe fisse.
Il comando grep accetta tre argomenti:
Poi legge il contenuto dei file specificati (nell'ordine indicato), trova le righe che contengono la stringa di ricerca e infine restituisce quelle righe nell'ordine in cui sono state trovate. Quando cerca in più file, ogni riga corrispondente è preceduta dal nome del file e dai due punti (':').
Il comando grep supporta i seguenti flag:
-n Anteponi il numero di riga e i due punti (':') a ogni riga dell'output, mettendo il numero dopo il nome del file (se presente).-l Restituisci solo i nomi dei file che contengono almeno una riga corrispondente.-i Confronta ignorando la differenza tra maiuscole e minuscole.-v Inverti il programma: raccogli tutte le righe che non corrispondono.-x Cerca solo le righe in cui la stringa di ricerca corrisponde all'intera riga.A differenza di altri esercizi, grep richiede di interagire con il «mondo esterno»: leggere file, gestire errori di sistema e stampare su stdout.
In Lean, l'interazione con il sistema avviene di solito nella monade IO, che permette agli effetti collaterali di verificarsi in un ambiente circoscritto senza intaccare lo stato puro della maggior parte delle altre funzioni.
Lean permette di richiamare un file come script, o direttamente come script autonomo tramite lean --run, oppure con l'utilizzo di lake.
Un progetto Lean ha un solo punto di ingresso, una funzione chiamata main, che riceve una List String con tutti gli argomenti passati. Per simulare l'esecuzione di Grep.lean come eseguibile, in questo esercizio gli argomenti vengono passati allo stesso modo.
Lean offre delle funzioni per manipolare i file nella monade IO.FS. Per esempio, IO.FS.readFile può essere usato per leggere il contenuto di un file in un dato percorso, come String.
Invece di restituire un valore, questo esercizio richiede che i risultati vengano scritti sull'output standard o sull'errore standard. In Lean ci sono delle funzioni per questo scopo.
A differenza degli errori in Except, le eccezioni di IO sono effettivamente eccezioni a runtime. Puoi usare try/catch per gestirle:
try
/-
code that may possibly raise an exception
-/
catch msg =>
/-
code that is executed only if an exception was thrown
-/
Iscriviti a Exercism per imparare e padroneggiare Lean con 100 esercizi e il mentoring di persone reali, tutto gratis.