Det kan vara nödvändigt för vissa funktioner att returnera mer än ett värde. Detta kan åstadkommas genom att returnera en vektor av värden, men många gånger är det bekvämt att skicka en referens till en variabel. Du skickar en referens till en variabel till en funktion, och funktionen kommer att ställa in variabeln åt dig med en dereferering. Du måste inte använda referenser bara för detta syfte, men det är deras huvudsakliga användning.
Då du använder funktioner som returnerar värden genom referenser i argumentlistan, skicka bara variabelnamnet med ett et-tecken. Till exempel kommer följande kod att beräkna ett egenvärde för en matris A med initial egenvektorgissning x, och lagra den beräknade egenvektorn i variabeln v:
RayleighQuotientIteration (A,x,0.001,100,&v)
Detaljerna kring hur referenser fungerar och syntaxen liknar språket C. Operatorn & refererar en variabel och * derefererar en variabel. Båda kan endast tillämpas till en identifierare, så **a är inte ett giltigt uttryck i GEL.
Referenser förklaras bäst med ett exempel:
a=1; b=&a; *b=2;
nu innehåller a 2. Du kan också referera till funktioner:
function f(x) = x+1; t=&f; *t(3)
ger oss 4.
The first time a variable is referenced, it is created in the current
context unless it exists. So if we make a function that sets the variable to 2,
such as
function f(k) = (*k=2), then the
call
f(&n) will declare a new variable n
then the function
f will run and set it to 2. So there is
no need to write something like
n=0;f(&n). A new variable in the current
context is created even if a
variable exists in a higher context, such as in the global context.
So for example after
n=3;
function f(k) = (*k=2);
function g() = (f(&n);print(n));
g();
the variable n is still 3 and not 2. That is because inside
g, when n is referenced, it is a new
variable in the context of g. The function
f then sets this n to 2,
and then 2 is printed, but the n in the global context
is not touched. So we can use references to get values out of functions and
we do not need to explicitly declare them, nor do we have to worry about messing up
global variables that the user might be using for something else.