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

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

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

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

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

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

它是由其他工具内部使用还是由其他工具合成的?它是否可能只是Java早期从从未见过光明的语言特性中得到的产物?javac

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

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


答案 1

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

正如谷歌所建议的那样,它的存在是为了自动装箱。

如果您有这样的代码:

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级别的转换来简化编译。


答案 2

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

另一方面,在过程语言中,这被称为“声明变量”,因为变量的“值”单元格在过程语言中可能会发生变化。(在函数式语言中,它只是一个缩写,与首先写出来没有什么不同)

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

或者你的意思是只是在Java中?

let x = 2 in (x + 5)

是以下各项的简写:

(\x (x + 5)) 2

最终将减少到

(2 + 5)

哪里应该是λ。\

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