الأسرار

الأسرار

تمرين تعلّمي

مقدمة

الدوال المجهولة

تمتلك Gleam دوالًا من الدرجة الأولى، أي أن الدوال قيم عادية يمكن إسنادها إلى المتغيرات، وتمريرها كوسائط، وإرجاعها من دوال أخرى.

يمكن الإشارة إلى دالة مُسمّاة معرَّفة في وحدة باسمها.

pub fn main() {
  // Assign the function to a variable
  let f = add_one
  
  // Invoke the function
  f(1) // -> 2
  f(2) // -> 3
}

fn add_one(x) {
  x + 1
}

تمتلك Gleam أيضًا دوالًا مجهولة، تُعرَّف داخل دوال أخرى.

// Define the function
let f = fn(x) { x + 1 }

// Invoke the function
f(1) // -> 2
f(2) // -> 3

يُكتب نوع الدالة بصيغة مشابهة لصيغة الدوال المجهولة. يُكتب نوع دالة تأخذ Int وFloat وتُرجع Int هكذا:

fn(Int, Float) -> Int

يمكن للدوال المجهولة أن تشير إلى متغيرات كانت في النطاق عند تعريفها، ما يجعلها إغلاقات.

let secret_number = 42

// This function always returns 42
fn() { secret_number }

توفّر صيغة التقاط الدالة اختصارًا ملائمًا لإنشاء دوال مجهولة تمرّر وسيطًا واحدًا إلى دالة. هذان التعبيران متكافئان:

// Anonymous function syntax
let f = fn(x) { my_function(1, 2, x) }

// Function capture syntax
let f = my_function(1, 2, _)

التعليمات

في هذا التمرين، أُوكلت إليك مهمة كتابة برمجيات جهاز تشفير يعمل بإجراء تحويلات على البيانات. وتحتاج إلى أسلوب يتيح لك إنشاء دوال معقدة بمرونة عبر دمج دوال أبسط بعضها ببعض.

في كل مهمة، أرجِع دالة مجهولة يمكن استدعاؤها من النطاق المستدعي.

1. أنشئ دالة جمع

نفّذ secret_add. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتضيف إليه الوسيط المُمرَّر إلى secret_add.

let adder = secret_add(2)
adder(2)
// -> 4

2. أنشئ دالة طرح

نفّذ secret_subtract. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتطرح السر المُمرَّر إلى secret_subtract من ذلك الوسيط.

let subtractor = secret_subtract(2)
subtractor(3)
// -> 1

3. أنشئ دالة ضرب

نفّذ secret_multiply. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتضربه في السر المُمرَّر إلى secret_multiply.

let multiplier = secret_multiply(7)
multiplier(3)
// -> 21

4. أنشئ دالة قسمة

نفّذ secret_divide. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتقسمه على السر المُمرَّر إلى secret_divide.

let divider = secret_divide(3)
divider(32)
// -> 10

5. أنشئ دالة دمج

نفّذ secret_combine. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتطبّق عليه الدالتين المُمرَّرتين إلى secret_combine بالترتيب.

let multiply = secret_multiply(7)
let divide = secret_divide(3)
let combined = secret_combine(multiply, divide)

combined(6)
// -> 14
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Gleam Exercism

مستعد لبدء الأسرار؟

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