Referenser
Prev | Chapter 6. Programmering med GEL | Next

## Referenser

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.

Den första gång en variabel refereras skapas den i den aktuella kontexten om den inte finns. Så om vi gör en funktion som sätter variabeln till 2, som `function f(k) = (*k=2)`, så kommer anropet `f(&n)` deklarera en ny variabel `n`, sedan kommer funktionen `f` köras och sätta den till 2. Så det finns inget behov att skriva något som `n=0;f(&n)`. En ny variabel i aktuell kontext skapas även om en variabel finns i en högre kontext, som i den globala kontexten. Så till exempel är efter

    n=3;
    function f(k) = (*k=2);
    function g() = (f(&n);print(n));
    g();

variabeln `n` fortfarande 3 och inte 2. Detta är för att inuti `g`, när `n` refereras, är det en ny variabel i kontexten för `g`. Funktionen `f` sätter sedan detta `n` till 2, och sedan skrivs 2 ut, men `n` i den globala kontexten rörs inte. Så vi kan använda referenser för att få värden ur funktioner och vi behöver inte deklarera dem explicit, och inte heller behöver vi oroa oss för att röra till globala variabler som användaren kanske använder till något annat.

Prev | Up | Next
Returnera | Home | Vvärden