Grep

Grep

Difícil

Introdução

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.

Instruções

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:

  1. A string a ser buscada.
  2. Zero ou mais flags para personalizar o comportamento do comando.
  3. Um ou mais arquivos nos quais buscar.

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

Flags

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.

Processo de IO

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.

Leitura de argumentos

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.

Leitura de arquivos

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.

Escrita da saída

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.

Tratamento de erros do sistema

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
    -/
Editar via GitHub O link abre em uma nova janela ou aba
Lean Exercism

Tudo pronto para começar Grep?

Crie sua conta no Exercism para aprender e dominar Lean com 100 exercícios e mentoria humana de verdade, tudo de graça.