70

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

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

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

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

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

它是由其他工具在内部使用javac还是由其他工具合成?它是否可能只是 Java 早期的产物,来自从未见过的语言特性?

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

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

4

2 回答 2

46

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

正如谷歌所建议的那样,它存在于自动装箱中。

如果你有这样的代码:

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

于 2011-12-04T01:26:15.627 回答
4

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

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

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

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

let x = 2 in (x + 5)

是以下的简写:

(\x (x + 5)) 2

最终将减少到

(2 + 5)

where\应该是 lambda。

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

于 2011-12-04T12:51:08.713 回答