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

时间:2011-12-04 00:57:02

标签: java compiler-construction language-design let

Java编译器似乎支持let中的com.sun.tools.javac.tree.*个表达式(查找LetExpr)。

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

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

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

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

它是由javac内部使用还是由其他工具合成?从Java的早期阶段开始,它可能只是一种从未见过光的语言特征的神器吗?

今天有什么用处吗?

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

2 个答案:

答案 0 :(得分:45)

  

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

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级转换。

答案 1 :(得分:3)

这称为let形式,用于“缩写”。

另一方面,在过程语言中,这称为“声明变量”,因为变量的“值”单元格可以在过程语言中变异。 (在函数式语言中,它只是一个缩写,与首先写出来没有区别)

我可以想到许多语言在语言用户编写的源代码中使用它(Haskell,ML,Scheme,SBCL,Arc,...),所以不确定你是怎么看不到它的。 ..

或者你的意思是只用Java?

let x = 2 in (x + 5)

简写:

(\x (x + 5)) 2

最终将减少为

(2 + 5)

其中\应该是lambda。

至于它为什么用Java,不确定。它应该做的是声明变量,所以检查它是否在那里使用。