Java编译器似乎支持let
中的com.sun.tools.javac.tree.*
个表达式(查找LetExpr
)。
JCTree中的一条评论甚至提到了一些语法
(let int x = 3; in x+2)
当然,语言的语法不接受,在早期的编译阶段被拒绝。
我想知道这个构造的起源,这是我以前从未见过的。
它是由javac
内部使用还是由其他工具合成?从Java的早期阶段开始,它可能只是一种从未见过光的语言特征的神器吗?
今天有什么用处吗?
一般来说,为什么会存在?
答案 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,不确定。它应该做的是声明变量,所以检查它是否在那里使用。