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'));
}

January 28th, 2008 at 11:12 AM
[…] 작동하지만, 함수 안쪽에서 만들어진 지역 변수는 잡아내질 못합니다. 그런 경우에는 어쩔 수 없이 편법을 사용해야 했는데, 그 방법이 다소 번거로운 것이 […]
March 1st, 2008 at 1:21 PM
[…] 새로운 구현이 훨씬 깔끔하고 직관적이니 참고 바란다. PHP에서 람다 구현, Phunctional Lambda, 함수 내에서 지역 변수 클로즈하기, Phunctional Lambda: 이제 고차 함수 […]