Nil у Gleam - це тип з єдиним значенням, яке теж називається Nil. Він схожий на void в інших мовах тим, що його використовують, коли функції немає іншого, доречнішого значення для повернення.
io.println("Hello, Joe!")
// -> Nil
Значення в Gleam не бувають «nil-able» чи «nullable», як у деяких інших мовах. Значення може бути Nil, лише якщо його тип - Nil, а значення будь-якого іншого типу ніколи не буває Nil.
Як і більшість мов програмування, Gleam має «побічні ефекти», тож функції можуть читати стан світу й змінювати його, а також повертати значення.
Модуль gleam/io зі стандартної бібліотеки Gleam надає функції для виведення рядків тексту (англ. string) у консоль.
io.println("Hello, Joe!")
// Hello, Joe!
// -> Nil
Інші пакети можуть надавати інші функції введення-виведення, як-от simplifile, пакет із функціями для читання й запису файлів.
simplifile.read("favourite-colour.txt")
// -> Ok("Pink\n")
Борис дуже захоплюється модельними залізницями і вирішив поділитися своєю пристрастю зі світом, започаткувавши розсилку. Він почне з того, що надішле перший випуск розсилки друзям і знайомим, які поділяють це захоплення. Їхні адреси електронної пошти зберігаються в текстовому файлі.
Підказка: скористайтеся модулем simplifile для операцій із файлами.
Реалізуйте функцію read_emails. Вона приймає рядок тексту (англ. string) зі шляхом до текстового файлу, який містить адреси електронної пошти, розділені символами нового рядка, і повертає масив адрес електронної пошти з цього файлу.
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 вправи та справжнє наставництво від людей, і все це безкоштовно.