Реализация замыканий в Lua?

У меня есть вопрос о том, как реализованы закрытия.

Предположим, это находится в файле с именем test.lua :

local a = 'asdf'

local function b()
    return a
end

a = 10

return b

А другой файл -

a = require 'test'
a()

, он напечатает

10

Если a является указателем на стек на 'asdf' (я предполагаю, что в куче, но это не имеет значения), а закрытие b создается так, предположительно, адрес, который был в a сохраняется для использования b , как a = 10 также изменяет указатель внутри замыкания?

Википедия очень хорошо говорит, что меня смущает:

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

Я подумал, что, возможно, b действительно не сохранил указатель на 'asdf' , а смещение стека на a , так что вы можете изменить a и смещение стека приведет вас к a , который указывает на последнее значение, которое вы установили для a , но тогда как это работает, когда a (указатель) выскакивает из стека, и смещение стека становится недействительным?

1 Я знаю, что Lua не выделяет значений в стеке, но выделяет локальные указатели в стеке к значениям в куче, не так ли?

11
задан Nicol Bolas 16 October 2011 в 00:47
поделиться