در Gleam دو نوع مختلف عدد وجود دارد: عدد صحیح و عدد اعشاری.
عدد صحیح یک عدد کامل است.
let integer = 3
// -> 3
Gleam چندین عملگر دارد که با عددهای صحیح کار میکنند.
1 + 1 // -> 2
5 - 1 // -> 4
5 / 2 // -> 2
3 * 3 // -> 9
5 % 2 // -> 1
2 > 1 // -> True
2 < 1 // -> False
2 >= 1 // -> True
2 <= 1 // -> False
عدد اعشاری عددی است که یک یا چند رقم بعد از جداکنندهی اعشاری دارد.
let float = 3.45
// -> 3.45
عددهای اعشاری هم عملگرهای مخصوص خود را دارند.
1.0 +. 1.4 // -> 2.4
5.0 -. 1.5 // -> 3.5
5.0 /. 2.0 // -> 2.5
3.0 *. 3.1 // -> 9.3
2.0 >. 1.0 // -> True
2.0 <. 1.0 // -> False
2.0 >=. 1.0 // -> True
2.0 <=. 1.0 // -> False
کد Gleam در قالب ماژولها سازماندهی میشود و هر فایل یک ماژول Gleam است.
تا اینجا توابع را با نحوهی نگارش pub fn نوشتهایم؛ این شکل نوشتن، تابعی را تعریف میکند که بهصورت عمومی در دسترس ماژولهای دیگر قرار دارد. توابعی که با fn تعریف میشوند، فقط در ماژولی که در آن تعریف شدهاند خصوصیاند و ماژولهای دیگر نمیتوانند از آنها استفاده کنند.
// This function is public
pub fn add(x, y) {
x + y
}
// This function is private
fn subtract(x, y) {
x - y
}
ماژولهای Gleam اسم دارند و اسم هر ماژول بر اساس مسیر فایل آن در پوشهی src یا test تعیین میشود.
برای مثال، ماژولی که در src\geometry\rectangle.gleam (در ویندوز) یا src/geometry/rectangle.gleam (در سیستمعاملهای شبیه یونیکس) تعریف شده باشد، اسمش geometry/rectangle خواهد بود.
دسترسی به توابعی که در ماژولهای دیگر تعریف شدهاند، از طریق وارد کردن آن ماژولها انجام میشود. وقتی ماژولی را وارد میکنید، همهی توابعی از آن ماژول که در دسترس قرار داده است، قابل دسترسی میشوند. اما نحوهی دسترسی به آنها بسته به نحوهی وارد کردن ماژول فرق میکند.
وارد کردن با پیشوند حالت پیشفرض است و برای دسترسی به تابعی در چنین ماژولی (مثلاً تابع map در ماژول gleam/list) اسم ماژول را بهعنوان پیشوند میآوریم (list.map).
// Import the int module
import gleam/int
pub fn run(x: Int) -> String {
// Use the to_string function from the int module
int.to_string(x)
}
بهطور پیشفرض، اسمی که برای اشاره به ماژول به کار میرود آخرین بخش اسم ماژول است، در این مورد int؛ اما با استفاده از کلیدواژهی as میتوان آن را تغییر داد.
// Import the int module and refer to it as i
import gleam/int as i
pub fn run(x: Int) -> String {
i.to_string(x)
}
وارد کردن بدون پیشوند این امکان را میدهد که مستقیماً به توابع در دسترس قرار گرفتهی آن ماژول دسترسی داشته باشید، بدون نوشتن پیشوند.
// Import the to_string function from the int module
import gleam/int.{to_string}
pub fn run(x: Int) -> String {
to_string(x)
}
وارد کردن با پیشوند ترجیح داده میشود، چون برای خواننده روشنتر میکند که تابع از کجا آمده و از تداخل اسمی هم جلوگیری میکند.
Gleam کتابخانهی استانداردی غنی و کاملاً مستند دارد. مستندات آن بهصورت آنلاین در hexdocs.pm/gleam_stdlib در دسترس است. این لینک را جایی برای خودتان ذخیره کنید؛ از آن زیاد استفاده خواهید کرد!
بیشتر انواع دادهی داخلی ماژول متناظری دارند که توابعی برای کار با آن نوع داده ارائه میدهد؛ مثلاً ماژول gleam/int برای عددهای صحیح، ماژول gleam/string برای رشتهها، ماژول gleam/list برای لیستها و به همین ترتیب.
در این تمرین قرار است کدی بنویسید که به Betty's Bike Shop کمک کند؛ فروشگاهی آنلاین برای دوچرخه و قطعات آن. سه کار پیش رو دارید که هدفشان نمایش درست قیمت دوچرخهها و قطعات در وبسایت است.
pence_to_pounds را صادر کنیدهمکارتان پیشتر اسکلت ماژول را نوشته است؛ یعنی توابع ناقص pence_to_pounds و pounds_to_string.
اما فراموش کرده است تابع pence_to_pounds را صادر کند، بنابراین در حال حاضر از سوی دیگر ماژولها یا مجموعهی تست دیده نمیشود.
تابع pence_to_pounds را صادر کنید.
در حال حاضر، قیمت بهصورت یک عدد صحیح از پنی ذخیره میشود (فروشگاه در بریتانیا مستقر است).
در وبسایت میخواهیم قیمت را بر حسب پوند نشان دهیم، بهطوری که ۱٫۰۰ پوند برابر با ۱۰۰ پنی باشد.
کار اول شما این است که تابع pence_to_pounds را پیادهسازی کنید؛ تابعی که مقداری Int از پنی میگیرد و آن را به معادل پوندیاش بهصورت Float تبدیل میکند.
همچنین باید برای این تابع حاشیهنویسی نوع انجام دهید.
pence_to_pounds(106)
// -> 1.06
از آنجا که دوچرخههای بتی با پوند فروخته میشوند، قیمتها باید با نماد «£» نمایش داده شوند.
بنابراین کار دوم شما این است که تابع pounds_to_string را پیادهسازی کنید؛ تابعی که مقداری پوند را بهصورت Float میگیرد و قیمت آن را بهصورت یک String برمیگرداند که نماد پوند در ابتدایش آمده است.
قبل از استفاده از ماژولهای gleam/float و gleam/string باید آنها را وارد کنید.
همچنین باید حاشیهنویسی نوع را برای pounds_to_string تعریف کنید.
pounds_to_string(1.06)
// -> "£1.06"