تمتلك 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, _)
في هذا التمرين، أُوكلت إليك مهمة كتابة برمجيات جهاز تشفير يعمل بإجراء تحويلات على البيانات. وتحتاج إلى أسلوب يتيح لك إنشاء دوال معقدة بمرونة عبر دمج دوال أبسط بعضها ببعض.
في كل مهمة، أرجِع دالة مجهولة يمكن استدعاؤها من النطاق المستدعي.
نفّذ secret_add. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتضيف إليه الوسيط المُمرَّر إلى secret_add.
let adder = secret_add(2)
adder(2)
// -> 4
نفّذ secret_subtract. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتطرح السر المُمرَّر إلى secret_subtract من ذلك الوسيط.
let subtractor = secret_subtract(2)
subtractor(3)
// -> 1
نفّذ secret_multiply. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتضربه في السر المُمرَّر إلى secret_multiply.
let multiplier = secret_multiply(7)
multiplier(3)
// -> 21
نفّذ secret_divide. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتقسمه على السر المُمرَّر إلى secret_divide.
let divider = secret_divide(3)
divider(32)
// -> 10
نفّذ secret_combine. يجب أن تُرجع دالة تأخذ وسيطًا واحدًا وتطبّق عليه الدالتين المُمرَّرتين إلى secret_combine بالترتيب.
let multiply = secret_multiply(7)
let divide = secret_divide(3)
let combined = secret_combine(multiply, divide)
combined(6)
// -> 14
سجّل في Exercism لتتعلّم وتتقن Gleam عبر 33 مفهومًا122 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.