LINUX.ORG.RU

История изменений

Исправление Legioner, (текущая версия) :

Когда говорят про замыкания, имеют в виду переменные, которые определены не в текущей функции, а выше.

Вообще проще понять это, когда делаешь сам свой ЯП и реализуешь там замыкания. Тут всё просто на самом деле. Когда ты присваиваешь переменной значение «функция», на самом деле в переменной хранится два значения: адрес кода, который надо выполнять, когда будет вызван оператор функции и адрес таблицы с указателями на внешние переменные, которые используются в коде этой функции. Вот эта таблица с указателями на внешние переменные и называется замыкание. И код функции при обращении к этим переменным обращается через эту таблицу.

А всё, что определено внутри функции, лежит на стеке, тут ничего сложного нет и ничего дополнительно передавать не надо. То, что там могут быть переменные с одним именем быть в разных scope-ах, это как раз ерунда, просто переименовываешь все переменные и всё, это как раз пример простого синтаксического сахара, который тривиально реализуется простым преобразованием кода.

Исправление Legioner, :

Когда говорят про замыкания, имеют в виду переменные, которые определены не в текущей функции, а выше.

Вообще проще понять это, когда делаешь сам свой ЯП и реализуешь там замыкания. Тут всё просто на самом деле. Когда ты присваиваешь переменной значение «функция», на самом деле в переменной хранится два значения: адрес кода, который надо выполнять, когда будет вызван оператор функции и адрес таблицы с указателями на внешние переменные, которые используются в коде этой функции. Вот эта таблица с указателями на внешние переменные и называется замыкание. И код функции при обращении к этим переменным обращается через эту таблицу.

А всё, что определено внутри функции, лежит на стеке, тут ничего сложного нет и ничего дополнительно передавать не надо.

Исходная версия Legioner, :

Когда говорят про замыкания, имеют в виду переменные, которые определены не в текущей функции, а выше.

Вообще проще понять это, когда делаешь сам свой ЯП и реализуешь там замыкания. Тут всё просто на самом деле. Когда ты присваиваешь переменной значение «функция», на самом деле в переменной хранится два значения: адрес кода, который надо выполнять, когда будет вызван оператор функции и адрес таблицы с указателями на внешние переменные, которые используются в коде этой функции. Вот эта таблица с указателями на внешние переменные и называется замыкание.

А всё, что определено внутри функции, лежит на стеке, тут ничего сложного нет и ничего дополнительно передавать не надо.