Nil در Gleam نوعی است با یک مقدار واحد، که به آن Nil هم میگویند. این نوع شبیه void در زبانهای دیگر است، از این جهت که وقتی یک تابع مقدار مناسب دیگری برای برگرداندن ندارد از آن استفاده میشود.
io.println("Hello, Joe!")
// -> Nil
مقادیر در Gleam مانند برخی زبانهای دیگر نمیتوانند تهی باشند. یک مقدار تنها زمانی میتواند Nil باشد که نوعش Nil باشد، و یک مقدار از هر نوع دیگری هرگز نمیتواند Nil باشد.
مانند بیشتر زبانهای برنامهنویسی، Gleam هم «اثرات جانبی» دارد، بنابراین توابع میتوانند وضعیت جهان را بخوانند و تغییر دهند، و همچنین مقداری را برگردانند.
ماژول gleam/io در کتابخانهی استاندارد Gleam توابعی برای چاپ رشتهها در کنسول فراهم میکند.
io.println("Hello, Joe!")
// Hello, Joe!
// -> Nil
بستههای دیگر ممکن است توابع ورودی/خروجی دیگری ارائه دهند، مانند 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)