Цель "let expression" (LetExpr) в компиляторе Java?
Компилятор Java, похоже, поддерживает выражения let
в com.sun.tools.javac.tree.*
(найдите LetExpr
).
Один комментарий в JCTree даже упоминает некоторый синтаксис
(let int x = 3; in x+2)
который, конечно, не принят грамматикой языка и отклонен в более ранней фазе компилятора.
Мне интересно о происхождении этой конструкции, о которой я никогда раньше не видел.
Используется ли он внутри javac
или синтезируется другими инструментами? Может быть, это просто артефакт с самых ранних дней Java из языковой функции, которая никогда не видела света?
Есть ли что-нибудь полезное, которое можно сделать с ним сегодня?
Вообще говоря, почему он существует?
Ответы
Ответ 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, не уверен. То, что он должен делать, это объявить переменные, поэтому проверьте, используется ли он там.