In
programming language theory
Programming language theory (PLT) is a branch of computer science that deals with the design, implementation, analysis, characterization, and classification of formal languages known as programming languages. Programming language theory is clos ...
, 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
Local may refer to:
Geography and transportation
* Local (train), a train serving local traffic demand
* Local, Missouri, a community in the United States
Arts, entertainment, and media
* ''Local'' (comics), a limited series comic book by Bria ...
nor the
global scope.
In
Lua they are called the ''upvalues'' of the function.
Programming in Lua (first edition)
''
Examples
Nested functions
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()
Anonymous functions
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) , 2, 3, 4, 5
Implementation issues
Non-local variables are the primary reason it is difficult to support nested, anonymous,
higher-order and thereby
first-class function
In computer science, a programming language is said to have first-class functions if it treats function (programming), functions as first-class citizens. This means the language supports passing functions as arguments to other functions, returning ...
s in a programming language.
If the nested function or functions are (mutually)
recursive, it becomes hard for the
compiler
In computing, a compiler is a computer program that Translator (computing), translates computer code written in one programming language (the ''source'' language) into another language (the ''target'' language). The name "compiler" is primaril ...
to know exactly where on the
call stack
In computer science, a call stack is a Stack (abstract data type), stack data structure that stores information about the active subroutines and block (programming), inline blocks of a computer program. This type of stack is also known as an exe ...
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
{{reflist
References
* Aho, Lam, Sethi, and Ullman. "7.3 Access to Nonlocal Data on the Stack". ''
Compilers: Principles, Techniques, & Tools''. Second edition.
Programming language theory
Variable (computer science)