Icke-lokal variabel

I programmeringsspråksteori är en icke-lokal variabel en variabel som inte är definierad i det lokala omfånget . Även om termen kan hänvisa till globala variabler , används den främst i samband med kapslade och anonyma funktioner där vissa variabler varken kan vara i det lokala eller globala omfånget .

I Lua kallas de för funktionens uppvärden .

Exempel

Kapslade funktioner

I Python 3-exemplet som följer finns en kapslad funktion inre definierad inom ramen för en annan funktion yttre . Variabeln x är lokal till yttre , men icke-lokal till inre (inte heller global):

 
      
     
         
          
        
      def  yttre  ():  x  =  1  def  inre  ():  icke-lokal  x  x  +=  1  utskrift  (  x  )  retur  inre 

I Javascript bestäms lokaliteten för en variabel av den närmaste var -satsen för denna variabel. I följande exempel x lokal till yttre eftersom den innehåller en var x -sats, medan inre inte gör det. Därför är x icke-lokal till inre :

  
       
      
          
        
    
     
 function  yttre  ()  {  var  x  =  1  ;  funktion  inre  ()  {  x  +=  1  ;  konsol  .  log  (  x  );  }  returnera  inre  ;  } 

Anonyma funktioner

I Haskell-exemplet som följer är variabeln c icke-lokal i den anonyma funktionen \x -> x + c :

                  yttre  =  låt  c  =  1  i  kartan  (  \  x  ->  x  +  c  )  [  1  ,  2  ,  3  ,  4  ,  5  ] 

Implementeringsfrågor

Icke-lokala variabler är den främsta anledningen till att det är svårt att stödja kapslade, anonyma, högre ordningens och därmed förstklassiga funktioner i ett programmeringsspråk.

Om den kapslade funktionen eller funktionerna är (ömsesidigt) rekursiva , blir det svårt för kompilatorn att veta exakt var på anropsstacken den icke-lokala variabeln allokerades, eftersom rampekaren endast pekar på den lokala variabeln för själva den kapslade funktionen och det kan finnas ett godtyckligt antal aktiveringsposter på stacken däremellan. Detta löses vanligtvis med hjälp av åtkomstlänkar eller visningsregister .

Om den kapslade funktionen skickas som ett argument till en högre ordningsfunktion måste en stängning byggas för att lokalisera de icke-lokala variablerna. Om den kapslade funktionen returneras som ett resultat av dess yttre funktion (eller lagras i en variabel) kommer de icke-lokala variablerna inte längre att vara tillgängliga i stacken. De måste tilldelas högar istället, och deras livstid sträcker sig längre än livslängden för den yttre funktion som deklarerade och tilldelade dem. Detta kräver i allmänhet sophämtning.

Anteckningar