ti-enxame.com

Objetivo de "deixar expressão" (LetExpr) no Java compilador?

O compilador Java parece ter suporte para let expressões em com.Sun.tools.javac.tree.* (procure por LetExpr).

Um comentário no JCTree até menciona alguma sintaxe

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

que obviamente não é aceito pela gramática do idioma e rejeitado em uma fase anterior do compilador.

Estou me perguntando sobre a origem dessa construção, que nunca vi antes.

É usado internamente por javac ou é sintetizado por outras ferramentas? Talvez seja apenas um artefato dos primeiros dias de Java de um recurso de linguagem que nunca viu a luz?

Existe algo útil que possa ser feito com isso hoje?

De um modo geral, por que existe?

70
soc

De um modo geral, por que existe?

Existe para autoboxing, como o Google sugere.

Se você tiver um código como este:

Integer foo = 0;
foo++;

Java internamente faz isso nesta expressão auxiliar:

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

Fonte: http://bugs.Sun.com/bugdatabase/view_bug.do?bug_id=6614974

Essa expressão obviamente não tem representação de sintaxe, é apenas uma transformação de nível AST para simplificar a compilação.

45
Armin Ronacher

Isso é chamado de let e é usado para "abreviar".

Por outro lado, nas linguagens procedurais, isso é chamado de "declarar uma variável" porque a célula "valor" da variável pode sofrer mutação nas linguagens de procedimentos. (Em linguagens funcionais, é apenas uma abreviação e não é diferente apenas escrever em primeiro lugar)

Posso pensar em muitas linguagens que a usam no código-fonte que o usuário escreve (Haskell, ML, Scheme, SBCL, Arc, ...), por isso não tenho certeza de como ainda não a viu ...

Ou você quis dizer apenas em Java?

let x = 2 in (x + 5)

É uma abreviação para:

(\x (x + 5)) 2

que eventualmente será reduzido a

(2 + 5)

onde \ deveria ser lambda.

Quanto ao motivo pelo qual está em Java, não tenho certeza. O que ele deve fazer é declarar variáveis, portanto verifique se é usado lá.

3
Danny Milosavljevic