Variables globales y ámbito de variables

GEL es un lenguaje con ámbitos dinámicos. Esto se explicará más adelante. Esto significa que a las variables ordinarias y a las funciones se les asigna un ámbito de manera dinámica. La única excepción son las variables de parámetros, que siempre son globales.

Al igual que la mayoría de los lenguajes de programación, GEL tiene diferentes tipos de variables. Normalmente, cuando se define una variable en una función ésta es visible desde esa función y desde todas las funciones que se llamen (todos los contextos superiores). Por ejemplo, suponga que una función f define una variable a y luego llama a otra función g. Entonces, la función g puede hacer referencia a la variable a. Pero, una vez que la ejecución de f concluye, la variable a sale del ámbito. Por ejemplo, el siguiente código imprime el número 5. No se puede llamar a la función g desde el nivel más alto (fuera de f, dado que a no se habrá definido).

Si define una variable dentro de una función, ésta anulará toda variable definida al llamar a funciones. Por ejemplo, si modifica el código anterior y escribe:

function f() = (a:=5; g());
function g() = print(a);
a:=10;
f();

Este código aún imprime 5. Pero si llama a la función g fuera de f, entonces se imprimirá 10. Observe que al definir a como 5 dentro de f no cambia el valor de a al nivel superior (global), por lo que si verifica el valor de a es aún 10.

Los argumentos de funciones son exactamente como variables definidas dentro de la función, salvo que éstas se inicializan con el valor que se introduce en la función. Además de esto, se les trata como a cualquier otra variable definida dentro de la función.

Las funciones se tratan exactamente como variables. Por lo tanto, puede redefinir funciones. Normalmente, (en el nivel superior) no puede redefinir variables y funciones protegidas. Pero localmente si lo puede hacer. Considere la siguiente sesión:

genius> function f(x) = sin(x)^2
= (`(x)=(sin(x)^2))
genius> function f(x) = sin(x)^2
= (`(x)=(sin(x)^2))
genius> function g(x) = ((function sin(x)=x^10);f(x))
= (`(x)=((sin:=(`(x)=(x^10)));f(x)))
genius> g(10)
= 1e20

Las funciones definidas en el nivel superior se consideran globales. Éstas son visibles desde cualquier parte. Como se dijo, la función f no cambiará el valor de a a 5.

a=6;
function f() = (a:=5);
f();

Sin embargo, en algunas ocasiones es necesario fijar una variable global dentro de una función. Cuando este comportamiento es necesario, utilice la función set. Si introduce una cadena o un identificador entrecomillado a esta función, ésta fija la variable globalmente (al nivel superior). Por ejemplo, podría utilizar

set(`a,3)

o

set("a",3)

para fijar el valor 3 en la variable a.

La función set siempre fija el nivel superior global. No existe alguna manera de definir una variable local en alguna función desde alguna subrutina. Si se necesita hacer esto, debe utilizar ...

Consulte también las funciones SetElement y SetVElement.

Para recapitular en un lenguaje más técnico: Genius opera con diferentes contextos numerados. El nivel más alto es el contexto 0 (cero). Siempre que se introduce una función , el contexto aumenta, y cuando la función devuelve su resultado el contexto disminuye. Siempre se puede ver una función o una variable desde los contextos mayores. Cuando una variable se define en un contexto menor, al fijar esta variable se crea una nueva variable local en el contexto actual y esta variable sera visible desde los contextos mayores.

También existen variables locales, que sólo pueden ser vistas desde el contexto actual. Cuando se devuelven funciones por un valor se pueden referenciar variables que no son visibles desde un contexto mas alto y esto puede ser problemático. Consulte las secciones Variables locales verdaderas y Devolver funciones.