grep

grep

어려움

소개

동네 도서관에서 오래된 책들을 정리하는 일을 맡게 됐어요. 도서관을 찾는 학생들은 학기말 논문에 인용할, 어렴풋이 기억나는 구절을 찾느라 자주 헤매곤 하죠. 책을 한 권씩 처음부터 끝까지 직접 읽는 대신, 그런 부분 인용구를 찾아 훑어볼 작은 도구를 만들기로 해요.

지침

검색 문자열과 일치하는 줄을 파일에서 찾아, 일치하는 모든 줄을 반환해요.

Unix grep 명령은 정규 표현식과 일치하는 줄을 파일에서 검색해요. 이번 과제는 고정 문자열 검색을 지원하는 단순화한 grep 명령을 구현하는 거예요.

grep 명령은 세 가지 인자를 받아요:

  1. 검색할 문자열.
  2. 명령의 동작을 바꾸는 0개 이상의 플래그.
  3. 검색할 파일 하나 이상.

그런 다음 지정된 파일의 내용을 (지정된 순서대로) 읽고, 검색 문자열을 포함하는 줄을 찾아, 마지막으로 찾은 순서대로 그 줄들을 반환해요. 여러 파일을 검색할 때는 일치하는 각 줄 앞에 파일 이름과 콜론(':')을 붙여요.

플래그

grep 명령은 다음 플래그를 지원해요:

  • -n 출력의 각 줄 앞에 줄 번호와 콜론(':')을 붙여요. 번호는 파일 이름이 있으면 파일 이름 뒤에 와요.
  • -l 일치하는 줄이 하나 이상 있는 파일의 이름만 출력해요.
  • -i 대소문자를 구분하지 않고 비교해서 일치 여부를 판단해요.
  • -v 동작을 반대로 뒤집어요. 일치하지 않는 모든 줄을 모아요.
  • -x 검색 문자열이 줄 전체와 일치하는 줄만 검색해요.

IO 처리 과정

다른 연습 문제와 달리 grep은 "외부 세계"와 상호작용해야 해요. 파일을 읽고, 시스템 오류를 처리하고, stdout에 출력하는 일이죠.

Lean에서는 보통 IO 모나드 안에서 시스템과 상호작용해요. 이 모나드는 대부분의 다른 함수들의 순수한 상태에 영향을 주지 않으면서, 부작용이 통제된 환경 안에서 일어나도록 해줘요.

인자 읽기

Lean에서는 파일을 스크립트로 실행할 수 있어요. lean --run으로 독립 실행형 스크립트로 바로 실행하거나, lake를 이용해서 실행할 수 있죠.

Lean 프로젝트에는 진입점이 하나 있는데, main이라는 함수예요. 이 함수는 전달된 모든 인자를 담은 List String을 받아요. 이 연습 문제에서는 Grep.lean을 실행 파일처럼 실행하는 것을 흉내 내기 위해, 같은 방식으로 인자를 전달해요.

파일 읽기

Lean은 IO.FS 모나드 안에서 파일을 다루는 함수를 제공해요. 예를 들어 IO.FS.readFile을 사용하면 주어진 경로에 있는 파일의 내용을 String으로 읽을 수 있어요.

출력 쓰기

이 연습 문제에서는 값을 반환하는 대신, 결과를 표준 출력이나 표준 오류에 써야 해요. Lean에는 이를 위한 함수가 있어요.

시스템 오류 처리

Except의 오류와 달리, IO 예외는 실제 런타임 예외예요. try/catch를 사용해서 처리할 수 있어요:

try
    /- 
        code that may possibly raise an exception 
    -/
catch msg =>
    /-
        code that is executed only if an exception was thrown
    -/
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Lean Exercism

grep 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Lean 트랙을 연습 문제 100개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.