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
. För att göra detta lägg till ett local-uttryck som det första uttrycket i funktionen (det måste alltid vara det första uttrycket 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-uttrycket 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 istället för en variabellista. I detta fall kommer variablerna förstås 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.