Подтвердить что ты не робот

Цель "let expression" (LetExpr) в компиляторе Java?

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Он существует для автобоксинга, как предлагает 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

Это выражение, очевидно, не имеет синтаксического представления, это просто преобразование уровня АСТ, чтобы упростить компиляцию.

Ответ 2

Это называется формой let и используется для "abbreviating".

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

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

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

let x = 2 in (x + 5)

Сокращение для:

(\x (x + 5)) 2

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

(2 + 5)

где \ предполагается лямбдой.

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