Javaコンパイラは、com.Sun.tools.javac.tree.*
のlet
式をサポートしているようです(LetExpr
を探してください)。
JCTreeの1つのコメントには、いくつかの構文も記載されています。
(let int x = 3; in x+2)
もちろん、言語の文法では受け入れられず、初期のコンパイラフェーズでは拒否されます。
このコンストラクトの起源については、今まで見たことがありません。
javac
によって内部的に使用されていますか、または他のツールによって合成されていますか? Java光を見たことのない言語機能からの非常に初期の頃の単なるアーティファクトでしょうか?
今日それでできることは何かありますか?
一般的に言えば、なぜ存在するのですか?
一般的に、なぜ存在するのですか?
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コンパイルを簡素化するレベル変換です。
これはletフォームと呼ばれ、「短縮」に使用されます。
一方、手続き型言語では、変数の「値」セルが手続き言語で変化する可能性があるため、これを「変数の宣言」と呼びます。 (関数型言語では、それは単なる略語であり、そもそもそれを書くことと同じです)
言語ユーザーが書くソースコードで使用する多くの言語(Haskell、ML、Scheme、SBCL、Arcなど)を考えることができます。
それとも、Javaだけでしたか?
let x = 2 in (x + 5)
略記:
(\x (x + 5)) 2
最終的には
(2 + 5)
どこ \
はラムダになるはずです。
なぜJavaにあるのかはわかりません。すべきことは変数を宣言することなので、そこで使用されているかどうかを確認します。