GleamのNilは、値が1つだけの型で、その値も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")
Borisは大の鉄道模型ファンで、その情熱を世界と共有しようとニュースレターを始めることにしました。まずは、同じ趣味を持つ友人や知り合いにニュースレターの第1号を送るところから始めます。その人たちのメールアドレスはテキストファイルに保存されています。
ヒント: ファイル操作には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)
メール送信の手順に必要な部品がそろったので、それらを1つの関数に組み合わせましょう。
send_newsletter関数を実装します。この関数は、メールアドレスが書かれたファイルのパス、ログファイルのパス、そして指定されたメールアドレスにメールを送る無名関数を受け取ります。
与えられたファイルからすべてのメールアドレスを読み込み、その一つひとつにメールを送信してみる必要があります。メールを送る無名関数がOkの値を返したら、そのメールアドレスをログファイルに書き込みます。書き込みは、メールを送った直後に行うようにしましょう。
send_newsletter(
"model_train_friends_emails.txt",
"newsletter_issue1_log.txt",
send_email,
)
// -> Ok(Nil)