Você arrumou um emprego em uma biblioteca local, ajudando a organizar a coleção de livros antigos dela. Os estudantes que frequentam a biblioteca vivem caçando citações que lembram só pela metade para citar em seus trabalhos acadêmicos. Em vez de ler manualmente cada livro de capa a capa, você decide criar uma pequena ferramenta para escaneá-los em busca dessas citações parciais.
Busque em arquivos as linhas que correspondem a uma string de busca e retorne todas as linhas correspondentes.
O comando grep do Unix busca, nos arquivos, as linhas que correspondem a uma expressão regular.
Sua tarefa é implementar um comando grep simplificado, que permite buscar por strings fixas.
O comando grep recebe três argumentos:
Em seguida, lê o conteúdo dos arquivos especificados (na ordem especificada), encontra as linhas que contêm a string de busca e, por fim, retorna essas linhas na ordem em que foram encontradas. Ao buscar em vários arquivos, cada linha correspondente é precedida pelo nome do arquivo e dois-pontos (':').
O comando grep aceita as seguintes flags:
-n Adiciona o número da linha e dois-pontos (':') no início de cada linha da saída, colocando o número depois do nome do arquivo (se houver).-l Exibe apenas os nomes dos arquivos que contêm pelo menos uma linha correspondente.-i Faz a correspondência usando uma comparação que ignora maiúsculas e minúsculas.-v Inverte o programa: coleta todas as linhas que não correspondem.-x Busca apenas as linhas em que a string de busca corresponde à linha inteira.Diferente de outros exercícios, o grep exige interagir com o "mundo externo": ler arquivos, tratar erros do sistema e imprimir em stdout.
Em Lean, a interação com o sistema costuma ser feita na mônada IO, que permite que efeitos colaterais ocorram em um ambiente contido, sem afetar o estado puro da maioria das outras funções.
O Lean permite chamar um arquivo como script, seja diretamente como um script independente por meio de lean --run, seja com o uso do lake.
Um projeto Lean tem um único ponto de entrada, uma função chamada main, que recebe uma List String com todos os argumentos passados a ela.
Para simular a execução de Grep.lean como um executável, os argumentos são passados da mesma forma neste exercício.
O Lean oferece funções para manipular arquivos na mônada IO.FS.
Por exemplo, IO.FS.readFile pode ser usado para ler o conteúdo de um arquivo em um determinado caminho, como uma String.
Em vez de retornar 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 essa finalidade.
Diferente dos erros em Except, as exceções de IO são de fato exceções de tempo de execução.
Você pode usar try/catch para tratá-las:
try
/-
code that may possibly raise an exception
-/
catch msg =>
/-
code that is executed only if an exception was thrown
-/
Crie sua conta no Exercism para aprender e dominar Lean com 100 exercícios e mentoria humana de verdade, tudo de graça.