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


El compilador Java parece tener soporte para expresiones let 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 anterior del compilador.

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 tal vez sólo un artefacto de la muy los primeros días de Java de una característica del lenguaje que nunca vio la luz?

¿Hay algo útil que se pueda hacer con él hoy?

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

Author: Peter Mortensen, 2011-12-04

2 answers

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 convierte esto en esta expresión auxiliar:

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.

 43
Author: Armin Ronacher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-04 01:26:15

Esto se llama la 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)

Se me ocurren muchos lenguajes que lo usan en el código fuente que el usuario escribe (Haskell, ML, Scheme, SBCL, Arc,...), así que no estoy seguro de cómo aún no lo has visto...

¿O solo en Java?

let x = 2 in (x + 5)

Es la 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 compruebe si se utiliza allí.

 3
Author: Danny Milosavljevic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-04 12:57:05