GEL är ett språk med dynamisk räckvidd. Vi kommer att förklara vad detta betyder nedan. Det betyder att normala variabler och funktioner har dynamisk räckvidd. Undantaget är parametervariabler som alltid är globala.
Som de flesta programmeringsspråk har GEL olika typer av variabler. Normalt då en variabel är definierad i en funktion är den synlig från den funktionen och från alla funktioner som anropas (alla högre kontexter). Till exempel, anta att en funktion f
definierar en variabel a
och sedan anropar funktionen g
. Då kan funktion g
referera till a
. Men då f
returnerar, går variabeln a
utom räckvidd. Till exempel kommer den följande koden att skriva ut 5. Funktionen g
kan inte anropas på toppnivån (utanför f
eftersom a
inte kommer vara definierad).
function f() = (a:=5; g()); function g() = print(a); f();
Om du definierar en variabel inuti en funktion kommer den åsidosätta variabler definierade i anropande funktioner. Som ett exempel modifierar vi koden ovan och skriver:
function f() = (a:=5; g()); function g() = print(a); a:=10; f();
Denna kod kommer fortfarande skriva ut 5. Men om du anropar g
utanför f
kommer du få utskriften 10. Observera att ställa in a
till 5 inuti f
ändrar inte värdet på a
på toppnivån (globalt), så om du nu kontrollerar värdet på a
kommer det fortfarande vara 10.
Funktionsargument är exakt som variabler definierade i funktionen, förutom att de initieras med värdet som skickats till funktionen. Förutom denna punkt behandlas de precis som alla andra variabler som definieras i funktionen.
Funktioner behandlas precis som variabler. Därmed kan du definiera om funktioner lokalt. Normalt (på toppnivån) kan du inte definiera om skyddade variabler och funktioner. Lokalt kan du dock göra detta. Anta följande session:
genius>
function f(x) = sin(x)^2
= (`(x)=(sin(x)^2))genius>
function f(x) = sin(x)^2
= (`(x)=(sin(x)^2))genius>
function g(x) = ((function sin(x)=x^10);f(x))
= (`(x)=((sin:=(`(x)=(x^10)));f(x)))genius>
g(10)
= 1e20
Funktioner och variabler definierade på toppnivån anses vara globala. De är synliga överallt. Som vi sa kommer den följande funktionen f
inte ändra värdet på a
till 5.
a=6; function f() = (a:=5); f();
Ibland är det dock nödvändigt att ställa in en global variabel inifrån en funktion. Då detta beteende behövs, använd funktionen set
. Att skicka en sträng eller en citerad identifierare till denna funktion ställer in variabeln globalt (på toppnivån). För att till exempel ställa in a
till värdet 3 kan du anropa:
set(`a,3)
eller:
set("a",3)
Funktionen set
ställer alltid in toppnivåglobalen. Det finns inget sätt att ställa in en lokal variabel i någon funktion från en subrutin. Om detta krävs måste du använda referensöverföring.
Se även funktionerna SetElement
och SetVElement
.
För att upprepa med mer tekniskt språk: Genius arbetar med olika numrerade kontexter. Toppnivån är kontext 0 (noll). Närhelst vi går in i en funktion höjs kontexten, och då funktionen returnerar sänks kontexten. En funktion eller en variabel är alltid synlig från alla kontexter med högre siffra. Då en variabel definierades i ett lägre kontextnummer, så har inställandet av denna variabel effekten att det skapar en ny lokal variabel i det aktuella kontextnumret och denna variabel kommer nu vara synlig från alla högre kontextnummer.
Det finns också verkligt lokala variabler som inte ses från någon annan plats än den aktuella kontexten. Vid returnering av funktioner efter värde kan det referera till variabler som ej är synliga från högre kontexter och detta kan vara ett problem. Se avsnitten Verkligt lokala variabler och Returnera funktioner.