Variables locales verdaderas

Cuando se pasa una función a otras funciones, la manera predeterminada en que se determinan los ámbitos de las variables puede no ser la que quiere. Por ejemplo:

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

probablemente quiere que la función r, en el momento que pasa como g a la función f, vea la variable k como 10 y no 5 y que el código devuelva 11 y no 6. Sin embargo, como está escrita, la función verá k con el valor 5. Existen dos maneras de resolver este problema. Una es hacer que r guarde k en un diccionario privado utilizando la notación de corchetes. Consulte la sección Devolver funciones.

Pero hay otra solución. Desde la versión 1.0.7 existen variables locales verdaderas. Éstas son variables que son visibles sólo desde el contexto actual y no desde ninguna función que se llame. Se podría definir k como una variable local en la función f. Para hacer esto, añada la sentencia local como la primera sentencia en la función (siempre debe de ser la primera sentencia de la función). También puede convertir cualquier argumento en una variable local. Esto es,

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

El código funcionará como se espera e imprimirá 11. Observe que la sentencia local inicializa todas las variables que se referencian (salvo los argumentos de funciones) como una constante null.

Si todas las variables se crean localmente, puede pasar un asterisco en lugar de una lista de variables. En este caso las variables no se inicializarán hasta que se fijen, desde luego. Entonces, la siguiente definición de f también funcionará:

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

Es bueno que todas las funciones que toman otras funciones como argumentos utilicen variables locales. De esta manera las funciones que pasan no ven los detalles de la implementación y luego no se confunden.