Nas linguagens de programação, os fechamentos são um recurso popular e frequentemente desejado. A Wikipedia diz (ênfase minha):
Na ciência da computação, um fechamento (...) é uma função juntamente com um ambiente de referência para as variáveis não locais dessa função. Um fechamento permite que uma função acesse variáveis fora de seu escopo lexical imediato.
Portanto, um fechamento é essencialmente um valor de função (anônimo?) Que pode usar variáveis fora de seu próprio escopo. Na minha experiência, isso significa que ele pode acessar variáveis que estão no escopo em seu ponto de definição.
Na prática, o conceito parece divergir, pelo menos fora da programação funcional. Linguagens diferentes implementam semânticas diferentes, até parece haver guerras de opiniões. Muitos programadores parecem não saber o que são fechamentos, visualizando-os como pouco mais que funções anônimas.
Além disso, parece haver grandes obstáculos ao implementar fechamentos. O mais notável é que o Java 7 deveria incluí-los, mas o recurso foi adiado para uma versão futura.
Por que os fechamentos são tão difíceis (de entender e) de realizar? Essa é uma pergunta muito ampla e vaga, portanto, deixe-me focar mais nessas perguntas interconectadas:
- Existem problemas com a expressão de fechamentos em formalismos semânticos comuns (pequeno passo, grande passo, ...)?
- Os sistemas de tipos existentes não são adequados para fechamentos e não podem ser estendidos facilmente?
- É problemático alinhar os fechamentos com uma tradução de procedimento tradicional baseada em pilha?
Observe que a pergunta se refere principalmente a linguagens processuais, orientadas a objetos e de script em geral. Tanto quanto eu sei, linguagens funcionais não têm nenhum problema.