En la teoría del lenguaje de programación , una variable no local es una variable que no está definida en el ámbito local. Si bien el término puede referirse a variables globales, se utiliza principalmente en el contexto de funciones anidadas y anidadas donde algunas variables no pueden estar ni en el ámbito local ni en el global .
Ejemplos de
Funciones anidadas
En el ejemplo de Python 3 que sigue, hay una función anidada inner
definida en el alcance de otra función outer
. La variable x
es local para outer
, pero no local para inner
(ni es global):
def exterior (): x = 1 def interior (): no local x x + = 1 print ( x ) return interior
En Javascript, la localidad de una variable está determinada por la var
declaración más cercana para esta variable. En el siguiente ejemplo, x
es local a outer
ya que contiene una var x
declaración, mientras inner
que no lo hace. Por lo tanto, x no es local para inner
:
función exterior () { var x = 1 ; función interior () { x + = 1 ; consola . log ( x ); } retorno interno ; }
Funciones anónimas
En el ejemplo de Haskell que sigue, la variable c
no es local en la función anónima \x -> x + c
:
exterior = sea c = 1 en el mapa ( \ x -> x + c ) [ 1 , 2 , 3 , 4 , 5 ]
Problemas de implementación
Las variables no locales son la razón principal por la que es difícil admitir funciones anidadas, anónimas, de orden superior y, por lo tanto, de primera clase en un lenguaje de programación.
Si la función o funciones anidadas son (mutuamente) recursivas , se vuelve difícil para el compilador saber exactamente en qué parte de la pila de llamadas se asignó la variable no local, ya que el puntero del marco solo apunta a la variable local de la función anidada en sí y puede haber un número arbitrario de registros de activación en la pila en el medio. Esto generalmente se resuelve mediante enlaces de acceso o registros de visualización .
Si la función anidada se pasa como argumento a una función de orden superior, es necesario crear un cierre para localizar las variables no locales. Si la función anidada se devuelve como resultado de su función externa (o se almacena en una variable), las variables no locales ya no estarán disponibles en la pila. En su lugar, deben asignarse en montón, y su vida útil se extiende más allá de la vida útil de la función externa que los declaró y asignó. Esto generalmente requiere recolección de basura.
Notas
Referencias
- Aho, Lam, Sethi y Ullman. "7.3 Acceso a datos no locales en la pila". Compiladores: principios, técnicas y herramientas . Segunda edicion.