2010-11-05 11 views
14

Ok, esta es una pregunta un tanto pedante pero me gustaría asegurarme de entender la definición correctamente. Es el apodo de cierre utilizada para describir las funciones anónimas que pueden variables de ascensor en el ámbito local (ya sea que realmente hacen o no) o sólo cuando hacer variables de elevación en el ámbito local?Cierre debido a lo que puede hacer o porque hace

En otras palabras, si una función anónima tiene la capacidad para levantar las variables en su ámbito local (Debido a que el lenguaje ofrece esa capacidad), pero no, ¿sigue siendo considerado un cierre?

Según tengo entendido, es un cierre solo cuando se levantan las variables locales. Pero una función anónima que no funciona (aunque puede) no es un cierre. Entonces, no todas las funciones anónimas son cierres, pero todos los cierres son funciones anónimas.

De nuevo, disculpe la pedantería, pero estas cosas me carcomen. :)

+0

Por lo que pides y no enseñas, no eres pedante para mí ^^ (http://dictionary.reference.com/browse/pedantic). ¡Esta pregunta también me interesa! –

+1

Otra forma de verlo es que en un lenguaje que tiene cierres, es probable que las funciones anónimas que no elevan las variables locales aún se representen en el tiempo de ejecución de la misma manera que los cierres reales, en aras de la uniformidad. Pero ahora que lo mencionas, sí, las personas tienden a usar "cierre" solo cuando hay alguna captura variable. –

Respuesta

25

Suponiendo que quiere decir en el contexto de la informática ...

Un cierre es una función de primera clase que captura los enlaces léxicos de variables libres en su entorno definir. Una vez que ha capturado los enlaces léxicos, la función se convierte en un cierre porque "cierra" esas variables.

Nota esto significa que los cierres solo existen en tiempo de ejecución.

Para que una función sea un cierre es ortogonal a la función anónima o nombrada. Puede crear un idioma que le permita definir funciones nombradas para que sean cierres.

Aquí es un cierre "llamado" en Python:

def maker(): 
    count=[0] 
    def counter(): 
    count[0]=count[0]+1 
    return count[0] 
    return counter 
+0

Entonces, si no captura las variables locales, entonces no "cierra" ninguna variable y, por lo tanto, no es un cierre; eso tiene sentido. Buen punto para solo ser cierres en tiempo de ejecución. Pero creo que se podría hablar de un cierre en el código si será un cierre en tiempo de ejecución. Puede que no sea ontológicamente correcto, pero es conveniente hablar de eso de esa manera. Gracias por mencionar el punto acerca de cómo el concepto de cierre es ortogonal al concepto de función anónima. Ni siquiera pensé en eso, pero eso tiene sentido. – hcoverlambda

+1

Sin embargo (para lanzar una llave inglesa) en idiomas como Python y JavaScript, los * ámbitos que contienen * están vinculados, no solo las variables gratuitas. Por ejemplo, considere el uso de 'eval' o' locals() '- dentro de una rama, ¡no menos! ¿Ahora que? :-) –

+1

Python no vincula el alcance. En el momento en que evalúa la definición de 'contador', crea una "celda de cierre" para cada variable capturada, y las almacena en la función 'contador '. 'maker() .__ closure __ [0] .cell_contents' es una referencia a la lista que estaba vinculada a' count' en el momento en que se definió 'counter'. (También es un poco confuso que Python a veces usa "cierre" para referirse a la tupla de celdas, en lugar de la función que los contiene, pero ignora eso). Mientras tanto, 'maker() .__ code __. Co_freevars [0]' es ' 'c''. Así es como sabe que una referencia a 'c' es' LOAD_DEREF' en la celda 0. – abarnert

0

Una gran definición de un cierre se define aquí: lua.org

Cuando una función se escribe encerrado en otra función, tiene acceso completo a variables locales desde la función adjunta; esta característica se llama alcance léxico. Aunque eso puede parecer obvio, no lo es. El alcance léxico, más las funciones de primera clase, es un concepto poderoso en un lenguaje de programación, pero pocos idiomas respaldan ese concepto.

Cuestiones relacionadas