본문 바로가기

Project

Lexical Closure

A LexicalClosure, often referred to just as a closure, is a function that can refer to and alter the values of bindings established by binding forms that textually include the function definition.

Lexical closures are typically (but not always) formed by defining a function inside another function, for example

(in SchemeLanguage):

 (define (foo x) (define (bar y) (+ x y)) bar)

Now calling (foo arg) returns a closure consisting of a) the code of 'bar', and b) an environment where
x has the value of arg.

 (define bar1 (foo 1)) (define bar2 (foo 2))  (bar1 5) => 6 (bar2 5) => 7

In proper closures, not just the value is kept, but a reference to the actual object passed in. See the body
of this page for a full explanation. As you may have noticed, lexical closures are necessary for  CurryingSchonfinkelling.

And here's the same program in C# 2.0:

 static Function<int> makeCounter() { int count = 0; return delegate() { return ++count; } }

Function<int> counter1 = makeCounter();
Function<int> counter2 = makeCounter();
Console.WriteLine(counter1()) // prints 1
Console.WriteLine(counter1()) // prints 2
Console.WriteLine(counter2()) // prints 1

--- Some may ask: what are closures for? For a typical example, compare the pain some languages
have in getting a callback to occur. You register some specific function, or functor object, worry about
 who destroys it, etc. In CommonLisp, you register a LexicalClosure which closes over all the relevant
 state and objects, and the callback occurs when the other thread funcalls the closure. Problem
 solved---no fuss, no muss. Yet another [one of the BenefitsOfDynamicTyping]. --AlainPicard

--------------------------------------------------------------------------------------------------------------------

J2SE 7 에서 지원 될예정?인 Closure이다.
함수내에 다른함수를 Define해서 호출할때 호출된 함수는 Local즉 Lexical binding되어서 외부 변수에
닫혀있게 된다. 사실 이건 기본적인 함수호출방식에서 나오는 기능인데

y=f(x)에서 함수 f(x)에대해 x이외에는 함수에 어떤 영향을 끼치지못한다.

하지만 호출될 함수가 다른함수를 포함하고있다면 함수의 범위를 재정의 할수 있지않을까?

다시말해 각 function이(언어에서의) define될때에 lexical binding의 범위가 지정된다면
좀더 유용한 프로그래밍이 가능할것이다.

p.s 최근 일본의 Java World에서 지원된다는 기사를 보고 찾아보았던 내용이다.
(이번호가 마지막 이라는 아쉬운 사실...)

이 내용은 사실 예전 "해커와 화가"라는 책에서 이미 나왔던 이야기이다.

Languages that support lexical closures include:

수많은 랭귀지(interpreter언어?생각해보면 이러한 binding을 지원하려면 interpreter가 필수이다)가
이미 지원하고있다.