Nem lokális változó - Non-local variable

A programozási nyelv elméletében a nem lokális változó az a változó, amelyet a helyi hatókör nem határoz meg. Míg a kifejezés globális változókra utalhat, elsősorban beágyazott és anonim függvények összefüggésében használják, ahol egyes változók nem lehetnek sem lokális, sem globális hatókörben .

A Lua- ban a függvény felértékeinek nevezik őket .

Példák

Beágyazott funkciók

A következő Python 3 példában be van ágyazva inner egy másik függvény hatókörében definiált függvény outer . A változó x lokális outer , de nem lokális inner (és nem is globális):

def outer():
    x = 1
    def inner():
        nonlocal x
        x += 1
        print(x)
    return inner

A Javascriptben a változó helyét a változó legközelebbi var állítása határozza meg . A következő példában x lokális, outer mivel tartalmaz egy var x utasítást, míg inner nem. Ezért x nem lokális inner :

function outer() {
    var x = 1;
    function inner() {
        x += 1;
        console.log(x);
    }
    return inner;
}

Névtelen funkciók

A változót követő Haskell-példában c az anonim függvény nem lokális \x -> x + c :

outer = let c = 1 in map (\x -> x + c) [1, 2, 3, 4, 5]

Megvalósítási kérdések

A nem lokális változók az elsődleges okok, amelyek miatt nehéz beágyazott, anonim, magasabb rendű és ezáltal első osztályú funkciókat támogatni egy programozási nyelven.

Ha a beágyazott függvény vagy függvények (kölcsönösen) rekurzív , nehéz lesz a fordító , hogy pontosan tudják, hol a hívás verem a nem helyi változó különítettek mint frame pointer csak pont a helyi változó a beágyazott függvény is, és tetszőleges számú aktiválási rekord lehet a verem között. Ezt általában hozzáférési linkek vagy megjelenítési regiszterek segítségével oldják meg .

Ha a beágyazott függvényt argumentumként továbbítják egy magasabb rendű függvénynek , akkor a nem lokális változók felkutatásához lezárást kell építeni. Ha a beágyazott függvény a külső függvény eredményeként kerül visszaadásra (vagy egy változóban tárolódik), a nem lokális változók már nem lesznek elérhetők a veremben. Halomra kell őket kiosztani, és élettartamuk meghaladja az őket deklaráló és kiosztó külső funkció élettartamát. Ehhez általában szemétgyűjtésre van szükség.

Megjegyzések

Hivatkozások