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.