2011-03-16 18 views
8

Estoy un poco confundido en cuanto al término "cierre" utilizado en el Groovy documentation. De acuerdo con la documentación, su definición de cierre parece más una función anónima o lambda.Groovy Concepto de cierre

Entiendo que los lenguajes que admiten funciones de primera clase, normalmente permiten que se formen cierres. Sin embargo, hay una distinción entre los dos conceptos.

Por ejemplo, de acuerdo con los documentos de Groovy:

Un cierre en Groovy es un trozo anónimo de código que puede tomar argumentos, devolver un valor, y la referencia y utilizar variables declaradas en su entorno alcance.

En lenguaje de lenguaje funcional, dicho bloque de código anónimo podría denominarse expresión lambda anónima en general o expresión lambda con variables independientes o una expresión lambda cerrada si no contiene referencias a variables independientes (como umbral en el ejemplo anterior). Groovy no hace tal distinción.

Entonces, de acuerdo a la página Wikipedia sobre los cierres:

El cierre término se utiliza a menudo erróneamente en el sentido de función anónima.

¿Qué me falta?

Respuesta

11

Como se dice en el siguiente párrafo de la misma page you linked to in the groovy docs:

En sentido estricto, un cierre no se puede definido. Puede definir un bloque del código que hace referencia a variables locales o campos/propiedades, pero se convierte en un cierre solo cuando "vincula" (déle un significado ) este bloque de código a variables . El cierre es un concepto semántico de , como una instancia que no puede definir, simplemente cree. Estrictamente hablado un cierre es solo un cierre si todas las variables libres están vinculadas. A menos que esto suceda, solo está parcialmente cerrado , por lo tanto, no es realmente un cierre. Desde maravilloso no proporciona una manera de definir una función lambda cerrado y un bloque de código podría no ser una función cerrada lambda en absoluto (porque tiene variables libres), nos referimos a la vez como cierre - incluso como concepto sintáctico. Estamos hablando de ello como concepto sintáctico , porque el código de definición de y la creación de una instancia es uno, allí no hay diferencia. Sabemos muy bien que esta terminología es más o menos incorrecta, pero simplifica muchas cosas cuando se habla de código en un lenguaje que no "conoce" la diferencia.

+1

Quizás mis ojos se vidriaron mientras leía ese párrafo. – Steve

+0

Probablemente sea la última oración 'Sabemos muy bien que esta terminología es más o menos incorrecta, pero simplifica muchas cosas cuando se habla de código en un lenguaje que no" conoce "la diferencia. Eso lo explica mejor ;-) –

+0

Esa parte es clara. Sin embargo, es lo que antes causó que mi cerebro se rindiera mentalmente, y omita todo el párrafo. :) – Steve