Нелокальная переменная
В теории языков программирования — нелокальная переменная это переменная, которая не определена в локальной области видимости . Хотя этот термин может относиться к глобальным переменным , он в основном используется в контексте вложенных и анонимных функций , где некоторые переменные не могут находиться ни в локальной , ни в глобальной области видимости .
В Lua они называются повышающими значениями функции. [1]
Примеры
[ редактировать ]Вложенные функции
[ редактировать ]В следующем примере Python 3 есть вложенная функция inner
определено в области действия другой функции outer
. Переменная x
является локальным для outer
, но нелокальный для inner
(и не глобально):
def outer():
x = 1
def inner():
nonlocal x
x += 1
print(x)
return inner
В Javascript местоположение переменной определяется ближайшим var
оператор для этой переменной. В следующем примере x
является локальным для outer
поскольку он содержит var x
заявление, в то время как inner
нет. Следовательно, x нелокален для inner
:
function outer() {
var x = 1;
function inner() {
x += 1;
console.log(x);
}
return inner;
}
Анонимные функции
[ редактировать ]В примере Haskell, который следует за переменной c
нелокален в анонимной функции \x -> x + c
:
outer = let c = 1 in map (\x -> x + c) [1, 2, 3, 4, 5]
Проблемы реализации
[ редактировать ]Нелокальные переменные являются основной причиной того, что трудно поддерживать вложенные, анонимные функции высшего порядка и, следовательно, первоклассные функции в языке программирования .
Если вложенная функция или функции (взаимно) рекурсивны становится сложно , компилятору точно определить, где в стеке вызовов была выделена нелокальная переменная, поскольку указатель кадра указывает только на локальную переменную самой вложенной функции и может находиться произвольное количество записей активации между ними в стеке . Обычно это решается с помощью ссылок доступа или регистров отображения .
Если вложенная функция передается в качестве аргумента функции более высокого порядка, необходимо построить замыкание , чтобы найти нелокальные переменные. Если вложенная функция возвращается в результате своей внешней функции (или сохраняется в переменной), нелокальные переменные больше не будут доступны в стеке. Вместо этого они должны быть выделены в куче, а их время жизни выходит за рамки времени жизни внешней функции, которая их объявила и выделила. Обычно для этого требуется сбор мусора.
Примечания
[ редактировать ]Ссылки
[ редактировать ]- Ахо, Лам, Сетхи и Ульман. «7.3 Доступ к нелокальным данным в стеке». Составители: принципы, методы и инструменты . Второе издание.