En los lenguajes de programación, los cierres son una característica popular y a menudo deseada. Wikipedia dice (énfasis mío):
En informática, un cierre (...) es una función junto con un entorno de referencia para las variables no locales de esa función. Un cierre permite que una función acceda a variables fuera de su alcance léxico inmediato.
Entonces, un cierre es esencialmente un valor de función (¿anónimo?) Que puede usar variables fuera de su propio alcance. En mi experiencia, esto significa que puede acceder a las variables que están dentro del alcance en su punto de definición.
Sin embargo, en la práctica, el concepto parece ser divergente, al menos fuera de la programación funcional. Diferentes idiomas implementan diferentes semánticas, incluso parece haber guerras de opiniones sobre. Muchos programadores no parecen saber qué son los cierres, viéndolos como poco más que funciones anónimas.
Además, parece que existen obstáculos importantes al implementar cierres. Lo más notable, se suponía que Java 7 los incluiría, pero la característica se retrasó a una versión futura.
¿Por qué los cierres son tan difíciles de entender y realizar? Esta es una pregunta demasiado amplia y vaga, así que permítanme enfocarla más con estas preguntas interconectadas:
- ¿Hay problemas para expresar cierres en formalismos semánticos comunes (paso pequeño, paso grande, ...)?
- ¿Los sistemas de tipos existentes no son adecuados para cierres y no se pueden extender fácilmente?
- ¿Es problemático alinear los cierres con una traducción de procedimiento tradicional basada en pila?
Tenga en cuenta que la pregunta se refiere principalmente a lenguajes de procedimiento, orientados a objetos y scripts en general. Hasta donde yo sé, los lenguajes funcionales no tienen ningún problema.