Les fonctions: Les closures.
Avant de continuer sur les fonctions, il me semble important de clarifier le terme de closure qui sera plusieurs fois utilisé dans les chapitres et exemples suivants.
Il est important, avant de poursuivre, de réviser les notions de variables, de portée lexicale, de bloc contenant et contenu...
Définition.
Une closure ( en français, fermeture ou clôture ) est une fonction qui capture les références de variables libres dans l'environnement lexical.
A quoi ça sert!
A conserver la valeur d'une variable à un moment donné.
Explication:
Une variable possède deux composantes : un nom et une valeur.
Le principe d'une variable est que sa valeur peut varier d'un instant à l'autre.
Mais il arrive que l'on ait besoin de conserver cette valeur telle qu'elle est à un moment donné pour l'utiliser plus tard.
Pour ce faire, on va utiliser une closure.
Un exemple:
function Calcul(nombre)
function Ajouter(valeur)
return nombre + valeur
end
return Ajouter
end
Cette fonction, comme son nom l'indique, est prévue pour effectuer un calcul.
Elle va recevoir comme argument: nombre
A l'intérieur de Calcul, on définit une fonction Ajouter(). Vous remarquez que la variable nombre y est accessible, car elle a été définie en dehors de la fonction Ajouter.
La fonction Ajouter étant une variable, vous avez le droit de la retourner en tant que résultat de la fonction. ( return Ajouter )
Utilisation.
local x = Calcul(10)
print(x(2)) --> 12
print(x(5)) --> 15
print(x(9)) --> 19
La variable "x" contient la fonction Calcul qui elle même contient la fonction "Ajouter".
"x" est désormais une fonction dans laquelle la variable nombre existe encore. nombre sera toujours égal à 10.
Les paramètres de x, 2, 5, et 9, sont passés comme arguments à la fonction Ajouter.