Топ питань
Часова шкала
Чат
Перспективи
Нелокальна змінна
змінна, яку не визначено в локальній області видимості З Вікіпедії, вільної енциклопедії
Remove ads
У теорії мов програмування, нелокальна змінна — змінна, яку не визначено в локальній області видимості. Хоча термін може стосуватися глобальних змінних, його насамперед використовують у контексті вкладених та анонімних функцій, де деякі змінні можуть належати як не локальній, так і не глобальній області видимості.
Приклади
Вкладені функції
У наведеному нижче прикладі вкладеної функції мовою програмування 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 в анонімній функції \x -> x + c
змінна c
нелокальна:
outer = let c = 1 in map (\x -> x + c) [1, 2, 3, 4, 5]
Remove ads
Проблеми реалізації
Нелокальні змінні є основною причиною складності підтримки в мовах програмування вкладених, анонімних, вищого порядку і тим самим першого класу функцій.
Якщо вкладена функція або функції (взаємно) рекурсивні, то компілятору стає складно знати точно, де в стеку викликів виділено пам'ять для нелокальної змінної, оскільки покажчик кадру вказує тільки на локальну змінну вкладеної функції і в стеку може існувати довільна кількість записів активації. Зазвичай ця проблема розв'язується за допомогою access links або display registers[уточнити].
Якщо вкладена функція передається як аргумент у функцію вищого порядку, для знаходження нелокальних змінних має бути побудовано замикання. Якщо вкладена функція повертається як результат зі своєї зовнішньої функції (або зберігається в змінній) нелокальні змінні не будуть більше доступні в стеку. Натомість їх слід виділити в купі і час їхнього життя буде довшим від часу життя зовнішньої функції, яка оголосила та виділила їх. У загальних випадках для цього потрібний збирач сміття.
Remove ads
Примітки
Посилання
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads