Variables locales vraies
Précédent | Chapitre 7. Programmation avancée avec GEL | Suivant

## Variables locales vraies

Lors de la transmission de fonctions dans d'autres fonctions, la portée normale des variables peut être indésirable. Par exemple :

    k := 10;
    function r(x) = (x+k);
    function f(g,x) = (
      k := 5;
      g(x)
    );
    f(r,1)

vous souhaitez probablement que la fonction `r` lorsqu'elle est transmise à `g` dans `f`, puisse voir `k` comme 10 plutôt que 5 afin que le code renvoie 11 et pas 6. Cependant, tel que c'est écrit, la fonction lorsqu'elle est exécutée voit la variable `k` qui est égale à 5. Il y a deux façons de résoudre cela. L'une est que la fonction `r` obtienne `k` dans un dictionnaire privé en utilisant la notation crochet carré de la section Renvoi de fonctions.

But there is another solution. Since version 1.0.7 there are true local variables. These are variables that are visible only from the current context and not from any called functions. We could define `k` as a local variable in the function `f`. To do this add a local statement as the first statement in the function (it must always be the first statement in the function). You can also make any arguments be local variables as well. That is,

    function f(g,x) = (
      local g,x,k;
      k := 5;
      g(x)
    );

Then the code will work as expected and prints out 11. Note that the local statement initializes all the referenced variables (except for function arguments) to a `null`.

If all variables are to be created as locals you can just pass an asterisk instead of a list of variables. In this case the variables will not be initialized until they are actually set of course. So the following definition of `f` will also work:

    function f(g,x) = (
      local *;
      k := 5;
      g(x)
    );

C'est une bonne pratique que toutes les fonctions qui prennent d'autres fonctions comme argument, utilisent des variables locales. De cette manière, la fonction transmise ne voit pas les détails de l'implémentation et n'est pas perturbée.

Précédent | Niveau supérieur | Suivant
Renvoi de fonction | Sommaire | Procédure de démarrage de GEL