Java编译器中的“let expression”(LetExpr)的目的是什么?

Java编译器似乎支持在com.sun.tools.javac.tree.*查找expression式(查找LetExpr )。

JCTree的一个评论甚至提到了一些语法

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

这当然不被语言的语法所接受,并在早期的编译器阶段被拒绝。

我想知道这个构造的起源,这是我以前从未见过的。

它是由javac内部使用还是由其他工具合成? 这可能仅仅是从Java早期的语言特征,从未见过光的一个神器?

今天有什么有用的东西可以用吗?

一般来说,它为什么存在?

一般来说,它为什么存在?

它存在的自动装箱,如谷歌build议。

如果你有这样的代码:

 Integer foo = 0; foo++; 

Java在内部把它变成这个帮助expression式:

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

来源: http : //bugs.sun.com/bugdatabase/view_bug.do?bug_id=6614974

这个expression式显然没有语法表示,它只是一个简化编译的AST级转换。

这被称为letforms,用于“缩写”。

另一方面,在过程语言中,这被称为“声明一个variables”,因为variables的“值”单元可以在过程语言中变异。 (在函数式语言中,它只是一个缩写,没有什么不同,只是把它写出来)

我可以想象在语言用户编写的源代码中使用它的许多语言(Haskell,ML,Scheme,SBCL,Arc,…),所以不知道你怎么没有看到它…

还是你的意思只是在Java?

 let x = 2 in (x + 5) 

简写为:

 (\x (x + 5)) 2 

这将最终减less到

 (2 + 5) 

\应该是lambda。

至于为什么它在Java中,不知道。 它应该做的是声明variables,所以检查它是否在那里使用。