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.