В языках программирования замыкания являются популярной и часто желаемой функцией. Википедия говорит (выделение мое):
В информатике замыкание (...) - это функция вместе со средой ссылки для нелокальных переменных этой функции. Закрытие позволяет функции обращаться к переменным вне ее непосредственной лексической области.
Таким образом, замыкание - это, по сути, (анонимное?) Значение функции, которое может использовать переменные вне своей области видимости. По моему опыту, это означает, что он может получить доступ к переменным, которые находятся в области действия в точке его определения.
На практике эта концепция, похоже, расходится, по крайней мере, за пределами функционального программирования. Разные языки реализуют разную семантику, даже кажется, что существуют войны мнений. Многие программисты, похоже, не знают, что такое замыкания, рассматривая их как нечто большее, чем анонимные функции.
Кроме того, кажется, существуют серьезные препятствия при реализации замыканий. Наиболее примечательно, что Java 7 должен был включать их, но эта функция была перенесена в будущий выпуск.
Почему замыкания так трудно (понять и понять)? Это слишком широкий и расплывчатый вопрос, поэтому позвольте мне сосредоточиться на следующих взаимосвязанных вопросах:
- Есть ли проблемы с выражением замыканий в общих семантических формализмах (маленький шаг, большой шаг, ...)?
- Разве существующие системы типов не подходят для затворов и не могут быть легко расширены?
- Проблематично ли привести замыкания в соответствие с традиционным, основанным на стеке переводом процедур?
Обратите внимание, что вопрос в основном относится к процедурным, объектно-ориентированным языкам и языкам сценариев в целом. Насколько я знаю, функциональные языки не имеют никаких проблем.