المسارات
/
Gleam
Gleam
/
التمارين
/
متجر دراجات Betty
متجر دراجات Betty

متجر دراجات Betty

تمرين تعلّمي

مقدمة

الأعداد الصحيحة

يوجد في 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 (على Windows) أو src/geometry/rectangle.gleam (على أنظمة تشغيل شبيهة بـ UNIX) سيكون اسمها 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. تحويل البنسات إلى الجنيهات

حاليًا، يُخزَّن السعر كعدد صحيح من البنسات (فمتجر الدراجات موجود في المملكة المتحدة). على الموقع، نريد عرض السعر بالجنيهات، حيث يعادل 1.00 جنيه 100 بنس. مهمتك الأولى هي تنفيذ الدالة pence_to_pounds، التي تأخذ مقدارًا من البنسات من النوع Int وتحوّله إلى ما يعادله بالجنيهات من النوع Float. ينبغي لك أيضًا إضافة توصيفات النوع لهذه الدالة.

pence_to_pounds(106)
// -> 1.06

3. تنسيق السعر لعرضه على الموقع

بما أن دراجات Betty تُباع بالجنيهات، ينبغي عرض الأسعار مع رمز "£". مهمتك الثانية إذن هي تنفيذ الدالة pounds_to_string، التي تأخذ مقدارًا من الجنيهات من النوع Float وتُرجع السعر معروضًا كـString مسبوقًا برمز الجنيه.

ينبغي لك استيراد الوحدتين gleam/float وgleam/string قبل استخدامهما.

ينبغي لك أيضًا تعريف توصيف النوع الخاص بالدالة pounds_to_string.

pounds_to_string(1.06)
// -> "£1.06"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Gleam Exercism

مستعد لبدء متجر دراجات Betty؟

سجّل في Exercism لتتعلّم وتتقن Gleam عبر 33 مفهومًا122 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.