Phunctional 0.9 Beta 2 릴리즈

Phunctional 0.9 Beta 2를 릴리즈했다. Phunctional은 PHP에서 함수형 프로그래밍(functional programming)을 흉내내는 프로젝트다. 람다, 클로져, 함수자, map(), filter(), reduce() 등의 기능을 제공하고 있다.
다운로드는 프로젝트 홈페이지에서 할 수 있다.
아래에 새로워진 것들을 늘어놓아보겠다. (그나저나 프로젝트 블로그를 따로 만들까 하는 생각도 든다. 이미 이 블로그는 Phunctional 프로젝트 블로그가 된 것 같음.)
모든 기능에 대해 단위 테스트 코드 추가
이번 버전에서 가장 많이 달라진 점은, 모든 기능에 대해 테스트 코드가 추가되었다는 점이다. 단위 테스팅 프레임워크로는 PHPUnit 3를 썼다. 이번에 테스트 코드를 작성하면서 잡은 버그도 굉장히 많았다.
Functor() 함수에서 MemberAccessor, MemberInvoker 인스턴스를 반환하는 기능 추가
이건 편의를 위해 추가된 기능인데, 다음 버전에서 좀더 강화될 예정. callable한 인자 아무 곳에나 '->member', '->method()' 형식의 문자열을 전달하면 MemberAccessor, MethodInvoker 인스턴스로 변환된다. (null을 전달할 경우 인수 그대로를 반환하는 함수자로 변환되는 것과 비슷하다.)
class Object {
public $value;
function __construct($value) { $this->value = $value; }
}
$values = map('->value', array(
new Object(1),
new Object(3.14),
new Object('value')
));
assert(array(1, 3.14, 'value') == $values);
EventHandler 추가
말 그대로 이벤트 핸들러. 배열과 유사한 인터페이스를 지닌(ArrayAccess, IteratorAggregate 구현. foreach문에서도 쓸 수 있고, 첨자 연산자 []도 사용 가능) 함수자이다. 호출할 경우 가지고 있는 함수자들을 순서대로 호출하고, 그것들이 반환한 값들을 배열로 반환한다.
$this->eventHandler = new EventHandler;
$this->eventHandler[] = 'is_int';
$this->eventHandler[] = 'is_string';
$this->eventHandler[] = new Binding('substr', array(1 => 1, 2 => -1));
$string = 'The best way to predict the future is to invent it.';
$results = $this->eventHandler->call($string);
$expected = array(false, true, substr($string, 1, -1));
assert($expected == $results);
Filterable, Mappable, Injectable 추가
컨테이너의 자료구조에 따라 Filter, Transformation, reduce()의 적용 방식을 더 효율적으로 할 수도 있기 때문에 만든 인터페이스이다. 아이디어는 후배 이흥섭 군이 내줬는데 구현은 내가 다했다.
그외 잡변화들
CompositeFunction에서 동작에 영향을 주지 않는null함수자는 무시하도록 개선 ([14], [16])- 쓸모가 없어 사용되지 않던
callback()단축 함수 제거 ([15]) Lambda문서에 문맥 클로즈에 대한 설명을 보충 ([17])- PHP 5.1부터 문자열에 대한
{offset}연산자가 사용되지 않기 때문에[offset]을 사용하도록 변경 ([19]) - 증감 연산자(
++,--)에 대한Callback작동 안하던 버그 고침 ([27]) Filter에서Filterable한 시퀀스를 받을 경우 오작동하던 버그 고침 ([31])Zip문서 추가 (#8, [36], [37], [38])Zip생성자의 시그너쳐가 가변 인자였던 것을, 배열 하나를 받도록 변경 ([36])Zip생성자에서 아무런iterable한 값도 받지 않을 경우 무한 루프에 빠지던 버그 고침 ([36])- iterator-utils의
compare()함수가 엉터리로 작동하던 버그 고침 ([39]) - 같은 내용의
RawLambda를 생성해도 내부적으로 다른 이름의 중복된 함수를 정의하던 것을 하나만 정의하도록 고침 ([41]) Lambda를include혹은require된 파일의 전역에서 사용할 경우 오작동하던 버그 고침 ([42])E_NOTICE에러 모두 제거 ([42])- iterator-utils의
all(),any()함수에서 함수자 전달되지 않던 버그 고침 ([42])

November 9th, 2007 at 7:09 PM
php를 멋지게 쓰시는군요… ^^
저두 좀 배워봐도 될까요?
제가 만든 클래스에도 한번 적용시켜 봐야겠네요… ^^;
November 9th, 2007 at 7:20 PM
php를 멋지게 쓰시네요… ^^
만드신거 가지고 공부를 좀 해봐야겠습니다.
November 10th, 2007 at 5:24 PM
감사합니다. 흐흐
소스는 다 공개되어 있으니 원하는 용도로 사용하시면 됩니다.