Jump to content

Нелокальная переменная

В теории языков программирования нелокальная переменная это переменная, которая не определена в локальной области видимости . Хотя этот термин может относиться к глобальным переменным , он в основном используется в контексте вложенных и анонимных функций , где некоторые переменные не могут находиться ни в локальной , ни в глобальной области видимости .

В 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]

Проблемы реализации

[ редактировать ]

Нелокальные переменные являются основной причиной того, что трудно поддерживать вложенные, анонимные функции высшего порядка и, следовательно, первоклассные функции в языке программирования .

Если вложенная функция или функции (взаимно) рекурсивны становится сложно , компилятору точно определить, где в стеке вызовов была выделена нелокальная переменная, поскольку указатель кадра указывает только на локальную переменную самой вложенной функции и может находиться произвольное количество записей активации между ними в стеке . Обычно это решается с помощью ссылок доступа или регистров отображения .

Если вложенная функция передается в качестве аргумента функции более высокого порядка, необходимо построить замыкание , чтобы найти нелокальные переменные. Если вложенная функция возвращается в результате своей внешней функции (или сохраняется в переменной), нелокальные переменные больше не будут доступны в стеке. Вместо этого они должны быть выделены в куче, а их время жизни выходит за рамки времени жизни внешней функции, которая их объявила и выделила. Обычно для этого требуется сбор мусора.

Примечания

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 360094daa9332c670afd5d01e92e8204__1652303280
URL1:https://arc.ask3.ru/arc/aa/36/04/360094daa9332c670afd5d01e92e8204.html
Заголовок, (Title) документа по адресу, URL1:
Non-local variable - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)