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

soc*_*soc 71 java compiler-construction language-design let

Java编译器似乎支持(寻找)let表达式.com.sun.tools.javac.tree.*LetExpr

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

(let int x = 3; in x+2)
Run Code Online (Sandbox Code Playgroud)

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

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

javac是由内部使用还是由其他工具合成?它可能只是Java早期的一件神器,它的语言功能从未见过光明吗?

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

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

Arm*_*her 46

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

谷歌建议它存在于自动装箱中.

如果您有这样的代码:

Integer foo = 0;
foo++;
Run Code Online (Sandbox Code Playgroud)

Java内部将其转换为此帮助程序表达式:

Integer foo = 0;
let int foo_helper = foo.intValue() in foo_helper++;
Run Code Online (Sandbox Code Playgroud)

资料来源:http://bugs.sun.com/bugdatabase/view_bug.do?video_id = 6614974

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

  • 那个页面并没有说它*存在*用于自动装箱,只是它在自动装箱中使用*.由于该页面是关于自动装箱的错误,而不是关于let-expressions,因此自动装箱是它提到的let-expressions的唯一用途并不奇怪.(我不是说你错了 - 我真的不知道 - 但我认为如果你知道一个,那么添加一个更相关/更有说服力/更明确的来源是有帮助的.) (13认同)
  • 什么`foo_helper ++中的'let int foo_helper = foo.intValue();`甚至意味着什么? (3认同)
  • 如何在foo_helper ++中`let int foo_helper = foo.intValue(); `与`{int foo_helper = foo.intValue();不同 foo_helper ++; }`?它好像是一个指针,不是吗?在第二个表达式中,表达式后不会更新foo的值 (2认同)