یک لیست در Gleam مجموعهای تغییرناپذیر از صفر یا چند مقدار است. مقدارهای یک لیست باید همگی یک نوع داشته باشند. چون لیستها تغییرناپذیرند، پس از ساختهشدن یک لیست، مقدارش هرگز تغییر نمیکند. هر تابع یا عملگری که به نظر میرسد لیست را تغییر میدهد (مثل افزودن یک عنصر)، در واقع یک لیست تازه برمیگرداند.
لیستها را میتوان چنین تعریف کرد:
let empty = []
let singleValue = [5]
let threeValues = ["a", "b", "c"]
رایجترین راه برای افزودن یک عنصر به لیست، استفاده از «نحوهی نگارش spread» است:
let two_to_four = [2, 3, 4]
let one_to_four = [1, ..two_to_four]
// -> [1, 2, 3, 4]
ماژول gleam/list در کتابخانهی استاندارد Gleam توابع مفید زیادی برای کار با لیستها دارد. این ماژول در کدهای Gleam بسیار پرکاربرد است، پس خوب است که با آن آشنا باشید.
از الگوهای لیست میتوان در عبارتهای case استفاده کرد تا با لیستها تطبیق داده شوند و مقدارهای درونشان به متغیرها نسبت داده شوند:
pub fn describe(list: List(String)) -> String {
case list {
[] -> "Empty list"
[x] -> "List with one item: " <> x
[x, y] -> "List with two items: " <> x <> " and " <> y
_ -> "List with three or more items"
}
}
علاوه بر تطبیق با لیستهایی با طول دقیق، میتوان از نحوهی نگارش spread برای تطبیق با لیستهایی استفاده کرد که دستکم طول مشخصی دارند:
pub fn describe(list: List(String)) -> String {
case list {
[_, _, ..] -> "List with at least two items"
[_] -> "List with one item"
[] -> "Empty list"
}
}
از نحوهی نگارش spread همچنین میتوان برای نسبت دادن بقیهی لیست به یک متغیر استفاده کرد:
pub fn remove_first_item(list: List(String)) -> List(String) {
case list {
// Return the list without the first item
[_, ..rest] -> rest
// There's no first item to remove, return an empty list
_ -> []
}
}
عبارتهای case باید برای هر مقدار ممکن از نوعی که روی آن تطبیق داده میشود یک الگو داشته باشند، بنابراین اغلب از یک الگوی نادیدهگرفتن نهایی (_) برای رسیدگی به مقدارهای باقیمانده استفاده میشود.
در این تمرین، کدی مینویسید که فهرستی از زبانهای برنامهنویسی را که میخواهید در Exercism یاد بگیرید پیگیری میکند.
شش کار پیش رو دارید که همگی به کار کردن با فهرستها مربوط میشوند.
برای پیگیری زبانهایی که میخواهید یاد بگیرید، باید یک فهرست جدید بسازید. تابع new_list را تعریف کنید که یک فهرست جدید و خالی برمیگرداند.
new_list()
// -> []
در حال حاضر، تکهکاغذی دارید که زبانهایی را که میخواهید یاد بگیرید روی آن نوشتهاید: Gleam، Go و TypeScript. تابع existing_list را تعریف کنید تا این فهرست را برگرداند.
existing_list()
// -> ["Gleam", "Go", "TypeScript"]
همانطور که Exercism را کاوش میکنید و زبانهای جالبتری پیدا میکنید، میخواهید آنها را به فهرستتان اضافه کنید. تابع add_language را پیادهسازی کنید تا یک زبان جدید را به ابتدای فهرستتان اضافه کند.
add_language(["OCaml", "Elixir"], "Scheme")
// -> ["Scheme", "OCaml", "Elixir"]
شمردن زبانها یکییکی دردسرساز است. تابع count_languages را پیادهسازی کنید تا تعداد زبانهای فهرستتان را بشمارد.
count_languages(["jq", "Elm", "Rust", "Kotlin"])
// -> 4
در نقطهای متوجه میشوید که فهرستتان در واقع برعکس مرتب شده است! تابع reverse_list را پیادهسازی کنید تا فهرستتان را برعکس کند.
reverse_list(["Python", "Julia", "Idris", "COBOL"])
// -> ["COBOL", "Idris", "Julia", "Python"]
هرچند همهی زبانها را دوست دارید، Gleam جایگاه ویژهای در قلب شما دارد. بنابراین، وقتی شرایط زیر برقرار باشد، از یک فهرست زبانها واقعاً هیجانزده میشوید:
تابع exciting_list را پیادهسازی کنید تا بررسی کند که آیا فهرست زبانها هیجانانگیز است:
exciting_list(["Lua", "Gleam"])
// -> True