java compiler-construction language-design let

¿Propósito de "let expression"(LetExpr) en el compilador de Java?



compiler-construction language-design (2)

En términos generales, ¿por qué existe?

Existe para autoboxing como sugiere Google.

Si tienes un código como este:

Integer foo = 0; foo++;

Java internamente hace esto en esta expresión de ayuda:

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 de sintaxis, es solo una transformación de nivel AST para simplificar la compilación.

El compilador de Java parece tener soporte para let expresiones en com.sun.tools.javac.tree.* (Busque LetExpr ).

Un comentario en JCTree incluso menciona alguna sintaxis

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

que por supuesto no es aceptado por la gramática del lenguaje y rechazado en una fase de compilación anterior.

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

¿Es utilizado 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 pueda hacerse hoy?

En términos generales, ¿por qué existe?


Esto se llama forma let y se usa 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 lenguajes funcionales, es solo una abreviatura y no es diferente a simplemente escribirlo en primer lugar)

Puedo pensar en muchos idiomas que lo usan en el código fuente que escribe el usuario del idioma (Haskell, ML, Scheme, SBCL, Arc, ...), así que no estoy seguro de cómo no lo viste todavía ...

¿O quisiste decir solo en Java?

let x = 2 in (x + 5)

Es una abreviatura de:

(/x (x + 5)) 2

que eventualmente se reducirá a

(2 + 5)

donde / se supone que es 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í.