70

Java コンパイラーは( を探してください) のlet式をサポートしているようです。com.sun.tools.javac.tree.*LetExpr

JCTree の 1 つのコメントには、いくつかの構文についても言及されています

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

もちろん、これは言語の文法によって受け入れられず、初期のコンパイラ段階で拒否されました。

これまでに見たことのないこの構造の起源について疑問に思っています。

内部で使用されてjavacいますか、それとも他のツールによって合成されていますか? それはもしかしたら、Java のごく初期の時代に、光を見たことのない言語機能からの成果物にすぎないのでしょうか?

今日それを使ってできることは何かありますか?

一般的に言えば、なぜそれが存在するのですか?

4

2 に答える 2

46

一般的に言えば、なぜそれが存在するのですか?

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 レベルの変換にすぎません。

于 2011-12-04T01:26:15.627 に答える
4

これはletフォームと呼ばれ、「省略」に使用されます。

一方、手続き型言語では、変数の「値」セルが手続き型言語で変化する可能性があるため、これは「変数の宣言」と呼ばれます。(関数型言語では、それは単なる略語であり、そもそも単にそれを書き出すのと同じです)

言語ユーザーが書いたソースコードでそれを使用している多くの言語(Haskell、ML、Scheme、SBCL、Arcなど)を考えることができるので、まだどのように表示されていないかわかりません...

それともJavaだけのことですか?

let x = 2 in (x + 5)

略記:

(\x (x + 5)) 2

最終的には

(2 + 5)

ここ\でラムダになるはずです。

なぜJavaにあるのかはわかりません。変数を宣言することになっているので、そこで使用されているかどうかを確認してください。

于 2011-12-04T12:51:08.713 に答える