Buscar..
Introducción
Desde la etiqueta de cierre StackOverflow:
Un cierre es una función de primera clase que hace referencia a las variables del ámbito en el que se definió. Si el cierre aún existe después de que finalice su ámbito de definición, las variables sobre las que se cierra también continuarán existiendo.
Observaciones
A veces es útil considerar cierres y objetos como similares.
El venerable maestro Qc Na caminaba con su alumno, Anton. Con la esperanza de incitar al maestro a una discusión, Anton dijo: "Maestro, he escuchado que los objetos son algo muy bueno, ¿es cierto?" Qc Na miró a su alumno con lástima y respondió: "Foolish pupil - los objetos son simplemente los cierres de un hombre pobre". Castigado, Anton se despidió de su maestro y regresó a su celda, con la intención de estudiar los cierres. Leyó detenidamente toda la serie de documentos "Lambda: The Ultimate ..." y sus primos, e implementó un pequeño intérprete de Scheme con un sistema de objetos basado en el cierre. Aprendió mucho y esperaba informar a su maestro sobre su progreso.
En su próxima caminata con Qc Na, Anton intentó impresionar a su maestro diciendo: "Maestro, he estudiado diligentemente el asunto, y ahora entiendo que los objetos son realmente los cierres de un hombre pobre". Qc Na respondió golpeando a Anton con su bastón, diciendo "¿Cuándo aprenderás? Los cierres son un objeto de los pobres". En ese momento, Anton se iluminó.
Fuente: http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent
Cierre con entorno estático.
Un cierre es un procedimiento que mantiene el estado interno:
Definir un procedimiento que devuelva un cierre.
El procedimiento make-an-adder
toma un argumento x
y devuelve una función que se cierra sobre el valor. O para decirlo de otra manera, x
está dentro del alcance léxico de la función devuelta.
#lang racket
(define (make-an-adder x)
(lambda (y)
(+ y x)))
Uso
Al llamar al procedimiento make-an-adder
devuelve un procedimiento que es un cierre.
Welcome to DrRacket, version 6.6 [3m].
Language: racket, with debugging; memory limit: 128 MB.
> (define 3adder (make-an-adder 3))
> (3adder 4)
7
> (define 8adder (make-an-adder 8))
> (8adder 4)
12