Назначение выражения "let expression" (LetExpr) в компиляторе Java? - PullRequest
70 голосов
/ 04 декабря 2011

Компилятор Java, похоже, поддерживает let выражения в com.sun.tools.javac.tree.* (ищите LetExpr).

Один комментарий в JCTree даже упоминает некоторый синтаксис

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

что, конечно, не принято грамматикой языка и отклонено на более ранней стадии компиляции.

Меня интересует происхождение этой конструкции, которую я никогда раньше не видел.

Используется ли он внутри javac или синтезируется другими инструментами? Может быть, это просто артефакт с самых ранних дней Java от языковой функции, которая никогда не видела свет?

Есть ли что-нибудь полезное, что можно сделать сегодня?

Вообще говоря, почему он существует?

Ответы [ 2 ]

45 голосов
/ 04 декабря 2011

Вообще говоря, почему он существует?

Он существует для автобоксинга, как предлагает Google.

Если у вас есть такой код:

Integer foo = 0;
foo++;

Java внутренне превращает это в это вспомогательное выражение:

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

Источник: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6614974

Это выражение, очевидно, не имеет синтаксического представления, это просто преобразование уровня AST для упрощения компиляции.

3 голосов
/ 04 декабря 2011

Это называется форма let и используется для «сокращения».

С другой стороны, в процедурных языках это называется «объявлением переменной», поскольку ячейка «значения» переменной может изменяться в языках процедур. (В функциональных языках это просто аббревиатура и ничем не отличается от простого написания)

Я могу вспомнить множество языков, которые используют его в исходном коде, который пишет пользователь (Haskell, ML, Scheme, SBCL, Arc, ...), поэтому не уверен, что вы его еще не видели. ..

Или вы имели в виду только на Java?

let x = 2 in (x + 5)

является сокращением для:

(\x (x + 5)) 2

, который в конечном итоге будет уменьшен до

(2 + 5)

, где \ - лямбда.

Что касается того, почему это на Java, не уверен. Он должен объявить переменные, поэтому проверьте, используется ли он там.

...