Skutečně lokální proměnné
Předcházející | Kapitola 7. Pokročilé programování v jazyce GEL | Další

## Skutečně lokální proměnné

Když předáváte funkce do jiných funkcí, může být normální rozsah působnosti proměnných nežádoucí. Například u

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

budete pravděpodobně chtít, aby funkce `r` při předání jako `g` do `f` viděla v proměnné `k` hodnotu 10 a ne 5, a kód tak vracel 11 a ne 6. Ale tak, jak je to napsáno, funkce při spuštění bude vidět `k` rovno 5. Existují dva způsoby, jak to vyřešit. Jeden je přimět funkci `r`, aby dostala `k` v privátním slovníku pomocí notace s hranatými závorkami, jak je ukázáno v kapitole Vracení funkcí.

Je zde ale i jiné řešení. Od verze 1.0.7 jsou k dispozici skutečně lokální proměnné. Jde o proměnné, které jsou viditelné pouze z aktuálního kontextu a ne z jakékoliv volané funkce. Mohli bychom definovat `k` jako lokální proměnnou ve funkci `f`. Uděláte to tak, že přidáte příkaz local jako první příkaz ve funkci (musí to být vždy první příkaz ve funkci). Lokální proměnnou můžete udělat také z kteréhokoliv argumentu. Pak to bude takto

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

a kód bude pracovat jak očekáváte a vypisovat 11. Upozorňujeme, že příkaz local inicializuje všechny odkazované proměnné (vyjma argumentů funkce) na `null`.

Pokud mají být jako lokální vytvořeny všechny proměnné, můžete místo seznamu proměnných prostě předat hvězdičku. V takovém případě nebudou proměnné inicializovány, dokud opravdu nejsou nastaveny. Takto bude i následující definice `f` pracovat:

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

Je dobrým zvykem, aby všechny funkce, které přebírají jiné funkce jako argumenty, používaly lokální proměnné. Je to způsob, jak zabránit, aby předávaná funkce neviděla implementační podrobnosti a nemátlo ji to.

Předcházející | Nahoru | Další
Vracení funkcí | Domů | Spouštěcí procedura GEL