stringtranslate.com

Variable no local

En la teoría de lenguajes 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 anónimas , donde algunas variables no pueden estar ni en el ámbito local ni en el global .

En Lua se llaman valores superiores de la función. [1]

Ejemplos

Funciones anidadas

En el ejemplo de Python 3 que sigue, hay una función anidada innerdefinida en el ámbito de otra función outer. La variable xes local para outer, pero no local para inner(ni tampoco es global):

def  exterior ():  x  =  1  def  interior ():  no local  x  x  +=  1  print ( x )  return  interior

En Javascript, la localidad de una variable se determina por la vardeclaración más cercana para esta variable. En el siguiente ejemplo, xes local a , outerya que contiene una var xdeclaración, mientras que innerno la contiene. Por lo tanto, x no es local a inner:

función externa () { var x = 1 ; función interna () { x += 1 ; console . log ( x ); } devolver interna ; }                

Funciones anónimas

En el ejemplo de Haskell que sigue, la variable cno 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 resulta 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 recursivas (mutuamente) , se vuelve difícil para el compilador saber exactamente en qué lugar de la pila de llamadas se asignó la variable no local, ya que el puntero de marco solo apunta a la variable local de la función anidada en sí y puede haber una cantidad arbitraria de registros de activación en la pila en el medio. Esto generalmente se resuelve utilizando enlaces de acceso o registros de visualización .

Si la función anidada se pasa como argumento a una función de orden superior, se debe 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 al montón y su vida útil se extiende más allá de la vida útil de la función externa que las declaró y las asignó. Esto generalmente requiere la recolección de basura.

Notas

  1. ^ Programación en Lua (primera edición), "27.3.3 – Upvalues"

Referencias