Arranjaste um emprego numa biblioteca local para ajudar a organizar a coleção de livros antigos. Os estudantes que a frequentam andam muitas vezes à procura de citações vagamente recordadas para citar nos seus trabalhos académicos. Em vez de leres manualmente todos os livros de fio a pavio, decides construir uma pequena ferramenta para os percorrer à procura dessas citações parciais.
Procura em ficheiros as linhas que correspondem a uma string de pesquisa e devolve todas as linhas correspondentes.
O comando grep do Unix procura em ficheiros as linhas que correspondem a uma expressão regular.
A tua tarefa é implementar um comando grep simplificado, que suporta a procura de strings fixas.
O comando grep recebe três argumentos:
De seguida, lê o conteúdo dos ficheiros indicados (pela ordem indicada), encontra as linhas que contêm a string de pesquisa e, por fim, devolve essas linhas pela ordem em que foram encontradas.
Ao procurar em vários ficheiros, cada linha correspondente é precedida pelo nome do ficheiro e por dois pontos (':').
O comando grep suporta as seguintes opções:
-n Acrescenta no início de cada linha da saída o número da linha e dois pontos (':'), colocando o número depois do nome do ficheiro (se existir).-l Mostra apenas os nomes dos ficheiros que contêm pelo menos uma linha correspondente.-i Compara sem distinguir maiúsculas de minúsculas.-v Inverte o programa, ou seja, reúne todas as linhas que não correspondem.-x Procura apenas as linhas em que a string de pesquisa corresponde à linha inteira.Ao contrário de outros exercícios, o grep implica interagir com o «mundo exterior»: ler ficheiros, tratar erros do sistema e escrever para stdout.
Em Lean, a interação com o sistema faz-se normalmente na mónada IO, que permite que ocorram efeitos secundários num ambiente contido sem afetar o estado puro da maioria das outras funções.
O Lean permite chamar um ficheiro como script, quer diretamente como script autónomo através de lean --run, quer com o recurso ao lake.
Um projeto Lean tem um único ponto de entrada, uma função chamada main, que recebe uma List String com todos os argumentos que lhe são passados.
Para simular a execução de Grep.lean como executável, os argumentos são passados da mesma forma neste exercício.
O Lean oferece funções para manipular ficheiros na mónada IO.FS.
Por exemplo, pode usar-se IO.FS.readFile para ler o conteúdo de um ficheiro num determinado caminho, como uma String.
Em vez de devolver um valor, este exercício exige que os resultados sejam escritos na saída padrão ou no erro padrão. Existem funções no Lean para este efeito.
Ao contrário dos erros em Except, as exceções de IO são exceções de tempo de execução.
Podes usar try/catch para as tratar:
try
/-
code that may possibly raise an exception
-/
catch msg =>
/-
code that is executed only if an exception was thrown
-/
Inscreve-te no Exercism para aprenderes e dominares Lean com 100 exercícios, e mentoria humana real, tudo grátis.