مسیرها
/
Gleam
Gleam
/
تمرین‌ها
/
فروشگاه دوچرخه‌ی بتی
فروشگاه دوچرخه‌ی بتی

فروشگاه دوچرخه‌ی بتی

تمرین یادگیری

مقدمه

عدد صحیح

در 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 کمک کند؛ فروشگاهی آنلاین برای دوچرخه و قطعات آن. سه کار پیش رو دارید که هدفشان نمایش درست قیمت دوچرخه‌ها و قطعات در وب‌سایت است.

1. تابع pence_to_pounds را صادر کنید

همکارتان پیش‌تر اسکلت ماژول را نوشته است؛ یعنی توابع ناقص pence_to_pounds و pounds_to_string. اما فراموش کرده است تابع pence_to_pounds را صادر کند، بنابراین در حال حاضر از سوی دیگر ماژول‌ها یا مجموعه‌ی تست دیده نمی‌شود.

تابع pence_to_pounds را صادر کنید.

2. پنی را به پوند تبدیل کنید

در حال حاضر، قیمت به‌صورت یک عدد صحیح از پنی ذخیره می‌شود (فروشگاه در بریتانیا مستقر است). در وب‌سایت می‌خواهیم قیمت را بر حسب پوند نشان دهیم، به‌طوری که ۱٫۰۰ پوند برابر با ۱۰۰ پنی باشد. کار اول شما این است که تابع pence_to_pounds را پیاده‌سازی کنید؛ تابعی که مقداری Int از پنی می‌گیرد و آن را به معادل پوندی‌اش به‌صورت Float تبدیل می‌کند. همچنین باید برای این تابع حاشیه‌نویسی نوع انجام دهید.

pence_to_pounds(106)
// -> 1.06

3. قالب‌بندی قیمت برای نمایش در وب‌سایت

از آنجا که دوچرخه‌های بتی با پوند فروخته می‌شوند، قیمت‌ها باید با نماد «£» نمایش داده شوند. بنابراین کار دوم شما این است که تابع pounds_to_string را پیاده‌سازی کنید؛ تابعی که مقداری پوند را به‌صورت Float می‌گیرد و قیمت آن را به‌صورت یک String برمی‌گرداند که نماد پوند در ابتدایش آمده است.

قبل از استفاده از ماژول‌های gleam/float و gleam/string باید آن‌ها را وارد کنید.

همچنین باید حاشیه‌نویسی نوع را برای pounds_to_string تعریف کنید.

pounds_to_string(1.06)
// -> "£1.06"
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Gleam Exercism

آماده‌اید فروشگاه دوچرخه‌ی بتی را شروع کنید؟

در Exercism ثبت‌نام کنید تا Gleam را همراه با 33 مفهوم122 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.