Замыкания и динамический охват? - PullRequest
7 голосов
/ 10 сентября 2010

Мне кажется, я понимаю, почему существует опасность допускать замыкания в языке с использованием динамической области видимости. То есть кажется, что вы сможете закрыть переменную OK, но при попытке прочитать ее вы получите только значение в верхней части глобального стека. Это может быть опасно, если в то же время другие функции используют одно и то же имя.

Я пропустил некоторые другие тонкости?

Ответы [ 2 ]

8 голосов
/ 02 июня 2012

Я понимаю, что на годы опаздываю, отвечая на этот вопрос, но я наткнулся на этот вопрос во время поиска в Интернете и хотел исправить некоторую дезинформацию, которая размещена здесь.

«Закрытие» означает просто вызываемый объект, который содержит как код, так и среду, которая обеспечивает привязки для свободных переменных в этом коде. Эта среда обычно является лексической, но нет технической причины, по которой она не может быть динамической.

Хитрость заключается в том, чтобы закрыть код в среде, а не в определенных значениях. Это то, что сделал 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

6 голосов
/ 10 сентября 2010

Да, это основная проблема. Термин «замыкание» является сокращением от «лексического замыкания», хотя по определению охватывает его лексический охват . Я бы назвал вещи в динамически ограниченном языке как-то иначе, как LAMBDA. Лямбды совершенно безопасны на динамически ограниченном языке, если вы не пытаетесь их вернуть.

(Для интересного мысленного эксперимента сравните проблему возврата динамической области лямбды в Emacs Lisp с проблемой возврата ссылки на переменную, выделенную в стеке, в C, и выясните, как и то, и другое невозможно в схеме.)

Давным-давно, когда языки с динамической областью действия были гораздо реже, чем сегодня, это было известно как проблема funargs . Проблема, о которой вы говорите, - это проблема с восходящими фунгарами.

...