Closure Impl. in Java

Tags:

Pretty nice to see this actually happening.

Java Closures: first prototype
Closures for the Java Programming Language

아래는 www.javac.info에서 가져온 예입니다.

두 정수의 합 구하기 Closure Literal.

{int x, int y => x+y}

두 정수의 합 구하기 Closure를 지역 변수 plus에 할당하기

{int,int=>int} plus = {int x, int y => x+y};

내부적으로는 위와 같은 literal들이 translation 됩니다. 예를들어,

{int,String=>Number throws IOException} xyzzy;

와 같은 변수 선언은

interface Closure1<R,A2,throws E> { // system-generated
    R invoke(int x1, A2 x2) throws E;
}
Closure1<? extends Number,? super String,null> xyzzy;

와 같이 변환됩니다.

Control Invocation Syntax의 예

withLock(lock) {
    System.out.println("hello");
}

file 처리의 예

with(FileReader in : makeReader()) with(FileWriter out : makeWriter()) {
    // code using in and out
}

Comments

5 responses to “Closure Impl. in Java”

  1. Sam Kong Avatar
    Sam Kong

    안녕하세요?
    오랜만에 와봤는데, 최근에 업데이트가 많이 됐네요.

    저는 개인적으로 Anonymous function과 Closure를 동일시 취급하는 것에 거부감을 가지고 있습니다.
    많은 사람들이 두 용어를 거의 혼용해서 사용하고 있습니다만, 사실 Closure는 bound variables 라는 요소가 반드시 포함돼야 하거든요.

    예에서 보여주신 대로
    {int x, int y => x+y}
    는 분명 Anonymous function이지만 Closure인지 아닌지 알 길이 없습니다.
    왜냐하면 이 코드가 외부변수에 접근하고 있지 않기 때문입니다.
    그러므로 Closure를 설명할 때는 반드시 외부변수에 접근하는 것을 보여줘야지만 Closure라는 게 명확해집니다.

    자바스크립트에서의 Closure 예를 들자면 다음과 같습니다.
    var f, g;
    function foo()
    {
    var x = 0;
    f = function() { return ++x; };
    g = function() { return –x; };
    x = 1;
    print(f()); // “2”
    }
    foo();
    print(g()); // “1”
    print(f()); // “2”

    위에서 보듯이 변수 x 는 로컬임에도 불구하고 foo()가 끝난 후에도 값이 보존이 되지요.
    g와 f에 bound됐기 때문이죠.

    제가 용어에 대해 너무 까다로운 편일까요?^^

  2. MKSeo Avatar
    MKSeo

    네. 까다로워요^^;
    하지만 정확하신 지적!

    익명 함수의 예 밖에 없더라구요..

  3. abraxsus Avatar
    abraxsus

    어이… 잘 지내고 있나??? ㅎㅎㅎ.. 이거 뭐 비밀기능이 안되네..
    이글루스좀 돌고 어쩌고 하다가.. 여기까지 왔다..
    한 백만년만에 와보는구나…
    난 아마 이번 겨울엔 한국 들어갈거같애…
    블로그를 보니 많은 일들이 있었나보구나….
    간만에 얼굴도보고 좀 얘기하고 싶은데 말이닷…ㅎㅎ
    다들 어찌사나 모르겠네..

  4. mkseo Avatar
    mkseo

    설 오면 연락해. 근데 나 폰 바꿨는데;; 루카와카나 규 통해서 연락하면 될 듯..

Leave a Reply

Your email address will not be published. Required fields are marked *