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.