Gleam의 Nil은 값이 하나뿐인 타입이고, 그 값의 이름도 Nil이에요. 다른 언어의 void와 비슷하게, 함수가 반환할 만한 더 적절한 값이 없을 때 사용해요.
io.println("Hello, Joe!")
// -> Nil
Gleam의 값은 다른 언어에서처럼 "nil이 될 수 있거나" "null을 허용하는" 값이 아니에요. 값의 타입이 Nil일 때만 그 값이 Nil일 수 있고, 다른 타입의 값은 절대 Nil이 될 수 없어요.
대부분의 프로그래밍 언어처럼 Gleam에도 "부수 효과"가 있어요. 그래서 함수는 값을 반환할 뿐만 아니라 세상의 상태를 읽고 바꿀 수도 있어요.
Gleam 표준 라이브러리의 gleam/io 모듈은 문자열을 콘솔에 출력하는 함수를 제공해요.
io.println("Hello, Joe!")
// Hello, Joe!
// -> Nil
다른 패키지에서 다른 IO 함수를 제공하기도 해요. 예를 들어 simplifile은 파일을 읽고 쓰는 함수를 제공하는 패키지예요.
simplifile.read("favourite-colour.txt")
// -> Ok("Pink\n")
보리스는 모형 기차를 아주 좋아해서, 자신의 열정을 세상과 나누기 위해 뉴스레터를 시작하기로 했어요. 먼저 같은 취미를 가진 친구와 지인들에게 뉴스레터 첫 번째 호를 보낼 거예요. 그들의 이메일 주소는 텍스트 파일에 저장되어 있어요.
힌트: 파일 작업에는 simplifile 모듈을 사용해요.
read_emails 함수를 구현해요. 이 함수는 줄바꿈으로 구분된 이메일 주소가 들어 있는 텍스트 파일의 경로 문자열을 받아서, 파일에서 읽은 이메일 주소의 배열을 반환해요.
read_emails("/home/my_user/documents/model_train_friends_emails.txt")
// -> Ok(["rick@example.com", "choochoo42@example.com", "anna@example.com"])
이메일을 보내는 일은 이메일 주소의 오타나 일시적인 네트워크 문제처럼 예측할 수 없는 여러 이유로 실패할 수 있어요. 중복으로 보내지 않고 친구들에게 이메일을 다시 보낼 수 있으려면, 이미 이메일을 받은 주소를 기록해 두어야 해요. 이를 위해 로그 파일이 필요해요.
create_log_file 함수를 구현해요. 이 함수는 파일 경로를 받아서 그 위치에 비어 있는 새 파일을 만들어요.
create_log_file("/home/my_user/documents/newsletter_issue1_log.txt")
// -> Ok(Nil)
log_sent_email 함수를 구현해요. 이 함수는 로그 파일의 경로와 이메일 주소가 담긴 문자열을 받아요. 파일에 이메일 주소를 쓰고, 그다음에 줄바꿈을 써요.
log_sent_email(
"/home/my_user/documents/newsletter_issue1_log.txt",
"joe@example.com",
)
// -> Ok(Nil)
이제 이메일을 보내는 절차의 모든 구성 요소를 갖췄으니, 이들을 하나의 함수로 합쳐야 해요.
send_newsletter 함수를 구현해요. 이 함수는 이메일 주소가 들어 있는 파일의 경로, 로그 파일의 경로, 그리고 주어진 이메일 주소로 이메일을 보내는 익명 함수를 받아요.
주어진 파일에서 모든 이메일 주소를 읽고, 각 주소로 이메일을 보내 봐야 해요. 이메일을 보내는 익명 함수가 Ok 값을 반환하면, 그 이메일 주소를 로그 파일에 기록해요. 이메일을 보내자마자 바로 기록해야 해요.
send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
send_email,
)
// -> Ok(Nil)
Exercism에 가입하고 Gleam 트랙을 개념 33개연습 문제 122개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.