W językach programowania zamknięcia są popularną i często pożądaną funkcją. Wikipedia mówi (moje podkreślenie):
W informatyce zamknięcie (...) jest funkcją wraz ze środowiskiem odniesienia dla zmiennych nielokalnych tej funkcji. Zamknięcie umożliwia funkcji dostęp do zmiennych poza jej bezpośrednim zakresem leksykalnym.
Zatem zamknięcie jest zasadniczo (anonimową?) Wartością funkcji, która może wykorzystywać zmienne poza swoim zakresem. Z mojego doświadczenia wynika, że może on uzyskiwać dostęp do zmiennych, które są objęte zakresem w punkcie definicji.
W praktyce koncepcja wydaje się rozbieżna, przynajmniej poza programowaniem funkcjonalnym. Różne języki wdrażają różne semantyki, a nawet wydaje się, że toczą się wojny o opinie. Wielu programistów wydaje się nie wiedzieć, czym są zamknięcia, postrzegając je jako niewiele więcej niż anonimowe funkcje.
Ponadto wydaje się, że istnieją poważne przeszkody przy wdrażaniu zamknięć. Najważniejsze, że Java 7 miała je zawierać, ale funkcja została przeniesiona z powrotem do przyszłej wersji.
Dlaczego zamknięcia są tak trudne (do zrozumienia i) do zrealizowania? To pytanie jest zbyt ogólne i niejasne, więc skupię się bardziej na tych powiązanych ze sobą pytaniach:
- Czy występują problemy z wyrażaniem zamknięć we wspólnych formalizmach semantycznych (mały krok, duży krok ...)?
- Czy istniejące systemy typów nie nadają się do zamknięć i nie można ich łatwo rozbudować?
- Czy problematyczne jest dostosowanie zamknięć do tradycyjnego tłumaczenia procedur opartego na stosie?
Zauważ, że pytanie dotyczy głównie języków proceduralnych, obiektowych i skryptowych. O ile mi wiadomo, języki funkcjonalne nie mają żadnych problemów.