Gleam a des fonctions de première classe, ce qui signifie que les fonctions sont des valeurs comme les autres : on peut les affecter à des variables, les passer en arguments et les renvoyer depuis d'autres fonctions.
Une fonction nommée définie dans un module peut être référencée par son nom.
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 dispose aussi de fonctions anonymes, qui se définissent à l'intérieur d'autres fonctions.
// Define the function
let f = fn(x) { x + 1 }
// Invoke the function
f(1) // -> 2
f(2) // -> 3
Le type d'une fonction s'écrit avec une syntaxe semblable à celle des fonctions anonymes. Le type d'une fonction qui prend un Int et un Float et renvoie un Int s'écrit comme ceci :
fn(Int, Float) -> Int
Les fonctions anonymes peuvent référencer des variables qui étaient dans leur portée au moment de leur définition, ce qui en fait des closures.
let secret_number = 42
// This function always returns 42
fn() { secret_number }
La syntaxe de capture de fonction offre un raccourci pratique pour créer des fonctions anonymes qui passent un seul argument à une fonction. Ces deux expressions sont équivalentes :
// Anonymous function syntax
let f = fn(x) { my_function(1, 2, x) }
// Function capture syntax
let f = my_function(1, 2, _)
Dans cet exercice, on t'a chargé d'écrire le logiciel d'un appareil de chiffrement qui fonctionne en effectuant des transformations sur des données. Tu as besoin d'un moyen de créer de manière flexible des fonctions complexes en combinant des fonctions plus simples entre elles.
Pour chaque tâche, renvoie une fonction anonyme qui peut être appelée depuis la portée de l'appel.
Implémente secret_add. Elle doit renvoyer une fonction qui prend un argument et lui ajoute l'argument passé à secret_add.
let adder = secret_add(2)
adder(2)
// -> 4
Implémente secret_subtract. Elle doit renvoyer une fonction qui prend un argument et soustrait à cet argument le secret passé à secret_subtract.
let subtractor = secret_subtract(2)
subtractor(3)
// -> 1
Implémente secret_multiply. Elle doit renvoyer une fonction qui prend un argument et le multiplie par le secret passé à secret_multiply.
let multiplier = secret_multiply(7)
multiplier(3)
// -> 21
Implémente secret_divide. Elle doit renvoyer une fonction qui prend un argument et le divise par le secret passé à secret_divide.
let divider = secret_divide(3)
divider(32)
// -> 10
Implémente secret_combine. Elle doit renvoyer une fonction qui prend un argument et lui applique, dans l'ordre, les deux fonctions passées à secret_combine.
let multiply = secret_multiply(7)
let divide = secret_divide(3)
let combined = secret_combine(multiply, divide)
combined(6)
// -> 14
Inscris-toi sur Exercism pour apprendre et maîtriser Gleam avec 33 concepts122 exercices, et un vrai mentorat humain, le tout gratuitement.