2011-12-04 31 views
70

Java編譯器似乎支持表達式com.sun.tools.javac.tree.*(查找LetExpr)。在JCTreeJava編譯器中的「let expression」(LetExpr)的用途是什麼?

一個評論甚至提到了一些語法

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

這當然不是由語言的語法接受和早期編譯器相拒絕。

我想知道這個構造的起源,這是我以前從未見過的。

javac內部使用還是由其他工具合成?它可能僅僅是從Java早期的語言特徵中看不到光的一個神器?

今天有什麼有用的東西可以用嗎?

一般來說,它爲什麼存在?

回答

43

一般來說,它爲什麼存在?

它存在於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級轉換即可簡化編譯。

+13

該頁面並沒有說它存在*用於自動裝箱,只是它在自動裝箱中被使用*。由於頁面是關於自動裝箱中的一個錯誤,而不是關於let-expressions,因此自動裝箱是它提及的let-expressions的唯一用途並不奇怪。 (我並不是說你錯了 - 我真的不知道 - 但是我認爲如果你知道一個,增加一個更相關的/有說服力的/明確的來源會有幫助。) – ruakh

+3

'let int foo_helper = foo.intValue()在foo_helper ++;'偶是什麼意思? – ArtB

+1

@ArtB它與ml語法類似。讓var =表達式中的值。因此,在表達式中,var的所有實例都會評估爲值。 – Matthew

3

這稱爲let形式,用於「縮寫」。

另一方面,在過程語言中,這稱爲「聲明變量」,因爲變量的「值」單元可以在過程語言中進行變異。 (在功能語言中,它只是一個縮寫,沒有什麼不同,只是首先寫出來)

我能想到很多語言在源代碼中使用它的語言用戶寫道(Haskell,ML,計劃,SBCL,弧,...),所以不知道你怎麼沒有看到它...

或者你的意思只是在Java?

let x = 2 in (x + 5) 

是速記:

(\x (x + 5)) 2 

最終將減少到

(2 + 5) 

其中\應該是拉姆達。

至於爲什麼它在Java中,不知道。它應該做的是聲明變量,所以檢查它是否在那裏使用。

+1

之後更新。在嚴格的函數式語言(例如ML,Scheme)中,使用let綁定與寫出表達式完全不同,因爲表達式必須在點綁定的地方。 Java中想到的最可能的用法是將具有副作用的代碼轉換爲靜態單一賦值表單,該表單更易於分析以生成優化的字節碼。 –