2011-12-04 20 views
70

El compilador de Java parece tener soporte para expresiones let en com.sun.tools.javac.tree.* (busque LetExpr).¿Propósito de "let expression" (LetExpr) en el compilador de Java?

Un comentario en JCTree siquiera menciona alguna sintaxis

(let int x = 3; in x+2) 

que por supuesto no es aceptada por la gramática de la lengua y la rechazó en una fase anterior del compilador.

Me pregunto sobre el origen de esta construcción, que nunca he visto antes.

¿Se usa internamente por javac o es sintetizado por otras herramientas? ¿Es acaso solo un artefacto de los primeros días de Java a partir de una característica del lenguaje que nunca vio la luz?

¿Hay algo útil que se pueda hacer hoy?

En general, ¿por qué existe?

Respuesta

43

En general, ¿por qué existe?

Existe para el autoboxing como sugiere Google.

Si usted tiene un código como éste:

Integer foo = 0; 
foo++; 

de Java interno hace que este en esta expresión ayudante:

Integer foo = 0; 
let int foo_helper = foo.intValue() in foo_helper++; 

Fuente: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6614974

Esa expresión, obviamente, no tiene representación sintaxis, es solo una transformación de nivel AST para simplificar la compilación.

+13

Esa página no dice que * existe * para el autoenlace, solo que * se usa * en el autoboxing. Como la página trata sobre un error en el autoboxing, no sobre let-expressions, no es sorprendente que el autoboxing sea el único uso para let-expressions que menciona. (No digo que estés equivocado, realmente no lo sé), pero creo que sería útil agregar una fuente más relevante/convincente/explícita, si conoces una). – ruakh

+3

¿Qué significa ' int foo_helper = foo.intValue() en foo_helper ++; '¿incluso significa? – ArtB

+1

@ArtB Es similar a la sintaxis ml. deje var = value en expression. Por lo tanto, en la expresión the, todas las instancias de var evalúan el valor. – Matthew

3

Esto se conoce como la forma let y se utiliza para "abreviar".

Por otro lado, en los lenguajes de procedimiento esto se llama "declarar una variable" porque la celda de "valor" de la variable puede mutar en los lenguajes de procedimiento. (En los lenguajes funcionales, es solo una abreviatura y no es diferente de solo escribirlo en primer lugar)

Se me ocurre una gran cantidad de idiomas que lo utilizan en el código fuente que escribe el usuario (Haskell, ML, Scheme, SBCL, Arc, ...), así que no estoy seguro de cómo no lo ha visto aún ...

¿O simplemente se refería a Java?

let x = 2 in (x + 5) 

es la abreviatura de:

(\x (x + 5)) 2 

que eventualmente se reduce a

(2 + 5) 

donde se supone que \ ser lambda.

En cuanto a por qué está en Java, no estoy seguro. Lo que se supone que debe hacer es declarar variables, así que verifique si se usa allí.

+1

En un lenguaje funcional estricto (por ejemplo, ML, Scheme), usar un enlace de let es bastante diferente de escribir la expresión porque la expresión debe evaluarse en el punto donde está ligado El uso más probable de esto que se le viene a la mente a Java es convertir el código con efectos secundarios al formulario de Asignación única estática, que se analiza más fácilmente para producir bytecode optimizado. –