web-dev-qa-db-ja.com

Javaコンパイラーの「let expression」(LetExpr)の目的は?

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

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

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

もちろん、言語の文法では受け入れられず、初期のコンパイラフェーズでは拒否されます。

このコンストラクトの起源については、今まで見たことがありません。

javacによって内部的に使用されていますか、または他のツールによって合成されていますか? Java光を見たことのない言語機能からの非常に初期の頃の単なるアーティファクトでしょうか?

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

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

70
soc

一般的に、なぜ存在するのですか?

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コンパイルを簡素化するレベル変換です。

45
Armin Ronacher

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

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

言語ユーザーが書くソースコードで使用する多くの言語(Haskell、ML、Scheme、SBCL、Arcなど)を考えることができます。

それとも、Javaだけでしたか?

let x = 2 in (x + 5)

略記:

(\x (x + 5)) 2

最終的には

(2 + 5)

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

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

3