У теорії мов програмування, нелокальна змінна — змінна, яку не визначено в локальній області видимості. Хоча термін може стосуватися глобальних змінних, його насамперед використовують у контексті вкладених та анонімних функцій, де деякі змінні можуть належати як не локальній, так і не глобальній області видимості.

У мові програмування Lua їх називають upvalues.Programming in Lua (first edition) , «27.3.3 — Upvalues »

Приклади

Вкладені функції У наведеному нижче прикладі вкладеної функції мовою програмування 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]

Проблеми реалізації Нелокальні змінні є основною причиною складності підтримки в мовах програмування вкладених, анонімних, вищого порядку і тим самим першого класу функцій.

Якщо вкладена функція або функції (взаємно) рекурсивні, то компілятору стає складно знати точно, де в стеку викликів виділено пам'ять для нелокальної змінної, оскільки покажчик кадру вказує тільки на локальну змінну вкладеної функції і в стеку може існувати довільна кількість записів активації. Зазвичай ця проблема розв'язується за допомогою access links або display registers.

Якщо вкладена функція передається як аргумент у функцію вищого порядку, для знаходження нелокальних змінних має бути побудовано замикання. Якщо вкладена функція повертається як результат зі своєї зовнішньої функції (або зберігається в змінній) нелокальні змінні не будуть більше доступні в стеку. Натомість їх слід виділити в купі і час їхнього життя буде довшим від часу життя зовнішньої функції, яка оголосила та виділила їх. У загальних випадках для цього потрібний збирач сміття.

Примітки

Посилання 7.3 Access to Nonlocal Data on the Stack // Aho, Lam, Sethi, і Ullman. . Second edition.