fbpx
Wikipedia

Non-local variable

In programming language theory, a non-local variable is a variable that is not defined in the local scope. While the term can refer to global variables, it is primarily used in the context of nested and anonymous functions where some variables can be in neither the local nor the global scope.

In Lua they are called the upvalues of the function.[1]

Examples edit

Nested functions edit

In the Python 3 example that follows there is a nested function inner defined in the scope of another function outer. The variable x is local to outer, but non-local to inner (nor is it global):

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

In Javascript, the locality of a variable is determined by the closest var statement for this variable. In the following example, x is local to outer as it contains a var x statement, while inner doesn't. Therefore, x is non-local to inner:

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

Anonymous functions edit

In the Haskell example that follows the variable c is non-local in the anonymous function \x -> x + c:

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

Implementation issues edit

Non-local variables are the primary reason it is difficult to support nested, anonymous, higher-order and thereby first-class functions in a programming language.

If the nested function or functions are (mutually) recursive, it becomes hard for the compiler to know exactly where on the call stack the non-local variable was allocated, as the frame pointer only points to the local variable of the nested function itself and there can be an arbitrary number of activation records on the stack in between. This is generally solved using access links or display registers.

If the nested function is passed as an argument to a higher-order function a closure needs to be built in order to locate the non-local variables. If the nested function is returned as a result from its outer function (or stored in a variable) the non-local variables will no longer be available on the stack. They need to be heap allocated instead, and their lifetime extends beyond the lifetime of the outer function that declared and allocated them. This generally requires garbage-collection.

Notes edit

  1. ^ Programming in Lua (first edition), "27.3.3 – Upvalues"

References edit

local, variable, programming, language, theory, local, variable, variable, that, defined, local, scope, while, term, refer, global, variables, primarily, used, context, nested, anonymous, functions, where, some, variables, neither, local, global, scope, they, . In programming language theory a non local variable is a variable that is not defined in the local scope While the term can refer to global variables it is primarily used in the context of nested and anonymous functions where some variables can be in neither the local nor the global scope In Lua they are called the upvalues of the function 1 Contents 1 Examples 1 1 Nested functions 1 2 Anonymous functions 2 Implementation issues 3 Notes 4 ReferencesExamples editNested functions edit In the Python 3 example that follows there is a nested function inner defined in the scope of another function outer The variable x is local to outer but non local to inner nor is it global def outer x 1 def inner nonlocal x x 1 print x return inner In Javascript the locality of a variable is determined by the closest var statement for this variable In the following example x is local to outer as it contains a var x statement while inner doesn t Therefore x is non local to inner function outer var x 1 function inner x 1 console log x return inner Anonymous functions edit In the Haskell example that follows the variable c is non local in the anonymous function x gt x c outer let c 1 in map x gt x c 1 2 3 4 5 Implementation issues editSee also Nested function Implementation and Man or boy test Non local variables are the primary reason it is difficult to support nested anonymous higher order and thereby first class functions in a programming language If the nested function or functions are mutually recursive it becomes hard for the compiler to know exactly where on the call stack the non local variable was allocated as the frame pointer only points to the local variable of the nested function itself and there can be an arbitrary number of activation records on the stack in between This is generally solved using access links or display registers If the nested function is passed as an argument to a higher order function a closure needs to be built in order to locate the non local variables If the nested function is returned as a result from its outer function or stored in a variable the non local variables will no longer be available on the stack They need to be heap allocated instead and their lifetime extends beyond the lifetime of the outer function that declared and allocated them This generally requires garbage collection Notes edit Programming in Lua first edition 27 3 3 Upvalues References editAho Lam Sethi and Ullman 7 3 Access to Nonlocal Data on the Stack Compilers Principles Techniques amp Tools Second edition Retrieved from https en wikipedia org w index php title Non local variable amp oldid 1087359297, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.