Me doy cuenta de que llevo años respondiendo esto, pero acabo de encontrarme con esta pregunta mientras hacía una búsqueda en la web y quería corregir alguna información errónea que se publica aquí.
"Cierre" solo significa un objeto invocable que contiene tanto código como un entorno que proporciona enlaces para variables libres dentro de ese código. Ese entorno suele ser un entorno léxico, pero no existe una razón técnica por la que no pueda ser un entorno dinámico.
El truco está en cerrar el código sobre el entorno y no en los valores particulares. Esto es lo que hizo Lisp 1.5, y también lo que MACLisp hizo por "funargs descendentes".
se puede ver cómo Lisp 1.5 hizo esto mediante la lectura del manual de 1.5 Lisp en http://www.softwarepreservation.org/projects/LISP/book
Prestar especial atención en el Apéndice B a cómo maneja eval FUNCIÓN y cómo aplicar las manijas FUNARG.
Puede conseguir el sabor básico de programación utilizando cierres dinámicos de http://c2.com/cgi/wiki?DynamicClosure
Usted puede obtener una en la introducción profundidad a las cuestiones de aplicación de ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-199.pdf
moderna de ámbito dinámico idiomas utilizan generalmente poco profunda unión, donde la corriente el valor de cada variable se mantiene en una ubicación global, y las llamadas a función guardan los valores antiguos en la pila. Una forma de implementar cierres dinámicos con enlace poco profundo se describe en http://www.pipeline.com/~hbaker1/ShallowBinding.html
No editaré la respuesta, pero: "Normalmente" es incorrecta: los cierres son siempre "cierre léxico", denominados así porque cierran la expresión sobre su entorno léxico En cuanto a que las lambdas son seguras, no poder usar lambdas como cierres está disminuyendo enormemente su valor, pero incluso sin eso, el alcance dinámico es intrínsecamente malo para la salud de tu programa, ya que no puedes estar seguro del significado de ninguna vinculación. –
Gracias por el enlace de funargs. Nunca aprendí esto antes. –
@Eli Barzilay: Tienes razón, estaba siendo demasiado desechable. Eliminaré 'generalmente'. En cuanto a la salud general del programa, estoy totalmente de acuerdo, pero la pregunta no es general. Como dije, las lambdas de alcance dinámico son casi tan seguras como las punteros sin restricciones ... –