Grep

Grep

Difícil

Introdução

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.

Instruções

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:

  1. A string a procurar.
  2. Zero ou mais opções para personalizar o comportamento do comando.
  3. Um ou mais ficheiros onde procurar.

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

Opções

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.

Processo de IO

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.

Leitura de argumentos

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.

Leitura de ficheiros

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.

Escrever a saída

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.

Tratamento de erros do sistema

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
    -/
Editar via GitHub A ligação abre numa nova janela ou separador
Lean Exercism

Estás pronto para começar Grep?

Inscreve-te no Exercism para aprenderes e dominares Lean com 100 exercícios, e mentoria humana real, tudo grátis.