Code Metaphor

Programming, Writing, Reading, Thoughts…

Phunctional Lambda, 함수 내에서 지역 변수 클로즈하기

요즘 하도 늦게 잤더니, 일찍 자려고 누웠다가 한 시간 넘게 뒤적거리고… 잠이 안와서 이런 뻘글 하나 올린다.

지난 포스팅에서 언급했듯, Phunctional Lambda는 클로져를 완벽하게 지원하고 있지 않다. 함수 내에서 생성된 지역 변수들은 클로즈할 수 없는 것이다. 아마 이 기능은 내가 Lambda를 C로 작성하기 전까지는 구현할 수 없을 것이다.

다만, 클로즈해야할 변수들을 수동으로 지정해서 사용할 수는 있다. 그 방법을 소개하겠다.

일단 def()? expression :fed() 형태의 람다 표현식은 Lambda 클래스의 인스턴스 객체를 반환한다. Lambda$context라는 public 멤버를 지니고 있다. 이름에서 짐작할 수 있듯, 이 곳에 클로즈된 변수들이 "변수 이름" => "값" 형태의 연관 배열로 들어있는 것이다. 여기에 있지도 않은 변수를 추가해서 사용하는 것도 가능하다.

$closure = def()? $a :fed();
$closure->context['a'] = "I'm there!";

이제 대충 감이 잡히지 않는가? 지난 글에서 Lambda에게 수치를 안겨주었던 그 예제 코드를 조금만 수정하면 잘 작동하는 코드로 만들 수 있다.

function ho_func() {
    $local = 123;

    $closure = def()? $local :fed();
    $closure->context += compact('local');
    return $closure;
}

compact() 함수를 사용하면 된다. 위 코드에서는 어차피 지역 변수가 $local 하나밖에 없기 때문에 적절치 않지만, 클로즈할 지역 변수가 두 개 이상 있다면 compact()를 사용하는 쪽이 편할 것이다. (자동으로 클로즈해준다면 훨씬 편하겠지만…)


이제는 아래와 같이 가능합니다.

function ho_func() {
    $local = 123;
    return def()? $local :fed(compact('local'));
}

This entry was posted on September 19, 2007 at 4:02 AM. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

2 Responses to “Phunctional Lambda, 함수 내에서 지역 변수 클로즈하기”

  1. Phunctional Blog » Blog Archive » Phunctional 0.9 릴리즈 Says:

    […] 작동하지만, 함수 안쪽에서 만들어진 지역 변수는 잡아내질 못합니다. 그런 경우에는 어쩔 수 없이 편법을 사용해야 했는데, 그 방법이 다소 번거로운 것이 […]

  2. Code Metaphor — Phunctional: PHP에서 함수형 프로그래밍을? Says:

    […] 새로운 구현이 훨씬 깔끔하고 직관적이니 참고 바란다. PHP에서 람다 구현, Phunctional Lambda, 함수 내에서 지역 변수 클로즈하기, Phunctional Lambda: 이제 고차 함수 […]

Powered by WordPress. Styled by Hong, MinHee. XML Feed, Comments XML Feed.