2011-12-04 2 views
70

Java 컴파일러는 표현을 com.sun.tools.javac.tree.* (LetExpr을 찾습니다)에 대한 지원을 갖고있는 것으로 보입니다. JCTree에서"let let"(LetExpr)을 Java 컴파일러에서 사용 하시겠습니까?

한 의견도 물론 언어의 문법에 의해 허용되지 않고 이전 컴파일러 단계에서 거부 일부 구문

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

을 언급하고있다.

이전에 본 적이없는이 구조의 근원에 대해 궁금합니다.

내부적으로 javac으로 사용 되었습니까? 아니면 다른 도구로 합성 되었습니까? 빛을 보지 못했던 언어 기능으로 Java의 아주 초기의 유물일까요?

오늘 할 수있는 유용한 것이 있습니까?

일반적으로 말하는 이유는 무엇입니까?

답변

43

일반적으로 말하는 이유는 무엇입니까?

Google에서 제안하는 것처럼 자동 폭발을 위해 존재합니다.

이 같은 코드가있는 경우 :

Integer foo = 0; 
let int foo_helper = foo.intValue() in foo_helper++; 

원본 : http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6614974 표현이 분명히 더 구문 표현이 없다는

, 그것의

Integer foo = 0; 
foo++; 

자바는 내부적으로이 도우미 표현에이를 수 컴파일을 단순화하는 AST 레벨 변환.

+13

그 페이지는 autoboxing을 위해서 * 존재한다고 말하지 않으며, 단지 autoboxing에서 * used * 라고만 말합니다. 이 페이지는 let-expressions에 관한 것이 아니라 autoboxing에 관한 버그이기 때문에 autoboxing이 let-expressions의 유일한 용도라고 언급 한 것은 놀라운 일이 아닙니다. (나는 당신이 틀렸다는 것을 말하지 않고있다. 나는 정말로 모른다. 그러나 당신이 알고 있다면 더 관련성이있는/확실한/명백한 소스를 추가하는 것이 도움이 될 것이라고 생각한다.) – ruakh

+3

'let int foo_helper = foo.intValue() in foo_helper ++;'심지어 의미합니까? – ArtB

+1

@ArtB ml 구문과 비슷합니다. expression에 var = value를 지정합니다. 따라서 표현식에서 var의 모든 인스턴스는 값으로 평가됩니다. – Matthew

3

이것을 let 양식이라고하며 "약어"로 사용됩니다.

반면에 프로 시저 언어에서는 변수의 "값"셀이 프로 시저 언어로 변형 될 수 있기 때문에 이것을 "변수 선언"이라고합니다. (함수형 언어에서는 그냥 약어 일 뿐이고, 처음부터 쓰는 것과 다르지 않습니다.)

언어 사용자가 작성한 소스 코드에서이 언어를 사용하는 많은 언어를 생각할 수 있습니다 (Haskell, ML, Scheme, SBCL, Arc, ...), 아직 보지 못했습니다.

또는 Java로 작성하셨습니까? 결국 \는 람다 있어야하는데

(2 + 5) 

로 감소됩니다

(\x (x + 5)) 2 

:

let x = 2 in (x + 5) 

는 속기입니다.

Java가 아닌 이유는 확실하지 않습니다. 변수를 선언하는 것이므로 변수가 사용되었는지 확인하십시오.

+1

다음에 업데이트되지 않습니다. 엄격한 함수 언어 (예 : ML, Scheme)에서는 let 바인딩을 사용하는 것이 표현식을 작성하는 것과 상당히 다릅니다 어디에 묶여 있는지. 자바를 염두에 두는 가장 좋은 방법은 부작용이있는 코드를 Static Single Assignment 형식으로 변환하는 것입니다.이 형식은보다 쉽게 ​​분석하여 최적화 된 바이트 코드를 생성합니다. –

관련 문제