2011-12-04 2 views
70

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

一つのコメントはさらにいくつかの構文はもちろん、言語の文法に受け入れられず、それ以前のコンパイラのフェーズに拒否

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

に言及しています。

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

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

今日は何ができるのですか?

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

答えて

43

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

Googleが示唆しているように、自動ボクシングのために存在します。

あなたは、このようなコードがある場合:それはだ、http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6614974

表現は明らかに何の構文表現を持っていないこと:

Integer foo = 0; 
let int foo_helper = foo.intValue() in foo_helper++; 

出典:

Integer foo = 0; 
foo++; 

をJavaは内部的にこのヘルパー表現にこれを作りますコンパイルを簡単にするASTレベルの変換だけです。

+13

そのページは、オートボクシングのために*存在するとは言わず、オートボクシングでは*使用されています。このページはlet式ではなく、autoboxingのバグに関するものなので、オートボクシングがlet式の唯一の使用であることは驚くべきことではありません。 (私はあなたが間違っていると言っているのではありません - 私は本当に知りませんが、あなたが知っていればもっと説得力のある/説得力のあるソースを追加すると役に立つと思います) – ruakh

+3

'let int foo_helper = foo_helper ++; foo.intValue()は 'でも意味ですか? – ArtB

+1

@ArtB ml構文に似ています。式ではvar = valueとします。したがって、式では、varのすべてのインスタンスが評価されます。 – Matthew

3

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

一方、プロシージャ言語では、変数の「値」セルがプロシージャ言語で変更できるため、これは「変数の宣言」と呼ばれます。 (機能的な言語では、それはちょうど省略形であり、最初にそれを書くことと変わりません)

私は、言語ユーザーが書いたソースコードでそれを使用する多くの言語を考えることができます(Haskell、 Scheme、SBCL、Arc、...)、あなたがまだそれを見なかったかどうかは分かりません...

あなたはJavaの意味ですか?結局\がラムダことになっている

(2 + 5) 

に削減されます

(\x (x + 5)) 2 

let x = 2 in (x + 5) 

は、の省略形です。

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

+1

の後に更新されません。厳密な関数言語(ML、Schemeなど)では、letバインディングを使用することは式の書き出しとはかなり異なりますどこに縛られていますか?これをJavaで使用する可能性が最も高いのは、副作用のあるコードをスタティック・シングル・アサインメント・フォームに変換することです。スタティック・シングル・アサインメント・フォームは、より簡単に分析され、最適化されたバイトコードを生成します。 –

関連する問題