Топ питань
Часова шкала
Чат
Перспективи

Нелокальна змінна

змінна, яку не визначено в локальній області видимості З Вікіпедії, вільної енциклопедії

Remove ads

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

У мові програмування Lua їх називають upvalues.[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 в анонімній функції \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

Примітки

Посилання

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads