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.
Like most programming languages, GEL has different types
of variables. Normally when a variable is defined in a function,
it is visible from that function and from all functions that are
called (all higher contexts). For example, suppose a function
f
defines a variable a
and then calls function g
. Then
function g
can reference
a
. But once f
returns,
the variable a
goes out of scope.
For example, the following code will print out 5.
The function g
cannot be called on the
top level (outside f
as a
will not be defined).
function f() = (a:=5; g());
function g() = print(a);
f();
If you define a variable inside a function it will override any variables defined in calling functions. For example, we modify the above code and write:
function f() = (a:=5; g());
function g() = print(a);
a:=10;
f();
This code will still print out 5. But if you call
g
outside of f
then
you will get a printout of 10. Note that
setting a
to 5 inside f
does not change
the value of a
at the top (global) level,
so if you now check the value of a
it will
still be 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.
Functions are treated exactly like variables. Hence you can locally redefine functions. Normally (on the top level) you cannot redefine protected variables and functions. But locally you can do this. Consider the following session:
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
Functions and variables defined at the top level are
considered global. They are visible from anywhere. As we
said the following function f
will not change the value of a
to 5.
a=6;
function f() = (a:=5);
f();
Sometimes, however, it is necessary to set
a global variable from inside a function. When this behavior is needed,
use the
set
function. Passing a string or a quoted identifier to
this function sets the variable globally (on the top level).
For example, to set
a
to the value 3 you could call:
set(`a,3)
or:
set("a",3)
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.