Я понимаю, что на годы опаздываю, отвечая на этот вопрос, но я наткнулся на этот вопрос во время поиска в Интернете и хотел исправить некоторую дезинформацию, которая размещена здесь.
«Закрытие» означает просто вызываемый объект, который содержит как код, так и среду, которая обеспечивает привязки для свободных переменных в этом коде. Эта среда обычно является лексической, но нет технической причины, по которой она не может быть динамической.
Хитрость заключается в том, чтобы закрыть код в среде, а не в определенных значениях. Это то, что сделал Lisp 1.5, а также то, что сделал MACLisp для «нисходящих funargs».
Вы можете увидеть, как это сделал Lisp 1.5, прочитав руководство по Lisp 1.5 на http://www.softwarepreservation.org/projects/LISP/book
Обратите особое внимание в Приложении B на то, как eval обрабатывает FUNCTION и как применять обрабатывает FUNARG.
Вы можете получить базовый вид программирования с использованием динамических замыканий из http://c2.com/cgi/wiki?DynamicClosure
Подробное введение в вопросы реализации можно получить по адресу ftp: //publications.ai.mit.edu/ai-publications/pdf/AIM-199.pdf
.
Современные языки с динамической областью применения обычно используют поверхностное связывание, где текущее значение каждой переменной хранится в одном глобальном местоположении, а вызовы функций сохраняют старые значения в стеке. Один из способов реализации динамического замыкания с мелкой привязкой описан в http://www.pipeline.com/~hbaker1/ShallowBinding.html