web-dev-qa-db-fra.com

Objectif de "let expression" (LetExpr) dans le Java?

Le compilateur Java semble prendre en charge les expressions let dans com.Sun.tools.javac.tree.* (recherchez LetExpr).

Un commentaire dans JCTree mentionne même une syntaxe

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

ce qui bien sûr n'est pas accepté par la grammaire de la langue et rejeté dans une phase de compilation antérieure.

Je m'interroge sur l'origine de cette construction, que je n'ai jamais vue auparavant.

Est-il utilisé en interne par javac ou est-il synthétisé par d'autres outils? Est-ce peut-être juste un artefact des tout premiers jours de Java d'une fonctionnalité de langage qui n'a jamais vu le jour?

Y a-t-il quelque chose d'utile qui puisse être fait aujourd'hui?

De manière générale, pourquoi existe-t-il?

70
soc

D'une manière générale, pourquoi existe-t-il?

Il existe pour l'autoboxing comme le suggère Google.

Si vous avez un code comme celui-ci:

Integer foo = 0;
foo++;

Java en interne en fait cette expression d'aide:

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

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

Cette expression n'a évidemment pas de représentation syntaxique, c'est juste une transformation de niveau AST pour simplifier la compilation.

45
Armin Ronacher

Cela s'appelle la forme let et est utilisé pour "abréger".

D'un autre côté, dans les langages procéduraux, cela s'appelle "déclarer une variable" car la cellule "valeur" de la variable peut muter dans les langages de procédure. (Dans les langages fonctionnels, c'est juste une abréviation et pas différent de simplement l'écrire en premier lieu)

Je peux penser à beaucoup de langages qui l'utilisent dans le code source écrit par l'utilisateur (Haskell, ML, Scheme, SBCL, Arc, ...), donc je ne sais pas comment vous ne l'avez pas encore vu ...

Ou vouliez-vous dire juste en Java?

let x = 2 in (x + 5)

Est un raccourci pour:

(\x (x + 5)) 2

qui sera finalement réduite à

(2 + 5)

\ est censé être lambda.

Quant à savoir pourquoi c'est en Java, je ne sais pas. Ce qu'il est censé faire, c'est déclarer des variables, alors vérifiez s'il y est utilisé.

3