Verkligt lokala variabler
Prev | Chapter 7. Avancerad programmering med GEL | Next

## Verkligt lokala variabler

Då funktioner skickas till andra funktioner kan den vanliga variabelräckvidden vara oönskad. Till exempel:

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

du vill antagligen att funktionen `r` då den skickas som `g` till `f` ska se `k` som 10 snarare än 5, så att koden returnerar 11 och inte 6. Som det är skrivet kommer dock funktionen då den exekveras se det `k` som är lika med 5. Det finns två sätt att lösa detta. En skulle vara att låta `r` få `k` i en privat ordbok genom hakparentesnotationen i avsnittet Returnera funktioner.

Men det finns en annan lösning. Sedan version 1.0.7 finns det verkligt lokala variabler. Dessa är variabler som är synliga endast från aktuell kontext och inte från några anropade funktioner. Vi kan definiera `k` som en lokal variabel i funktionen `f`. Lägg för att göra detta till en local-sats som den första satsen i funktionen (den måste alltid vara den första satsen i funktionen). Du kan också göra argument till lokala variabler. Det vill säga,

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

Då kommer koden fungera som förväntat och skriver ut 11. Observera att local-satsen initierar alla de refererade variablerna (förutom funktionsargument) till ett `null`.

Om alla variabler ska skapas som lokala kan du helt enkelt skicka en asterisk i stället för en variabellista. I detta fall kommer variablerna inte initieras förrän de faktiskt ställs in. Så följande definition av `f` kommer också att fungera:

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

Det är god sed att alla funktioner som tar andra funktioner som argument använder lokala variabler. På detta sätt ser den skickade funktionen inte implementationsdetaljer och blir förvirrad.

Prev | Up | Next
Returnera funktioner | Home | Uppstartsprocedur för GEL