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