Code Metaphor

Programming, Writing, Reading, Thoughts…

Phunctional도 좋아요

Python is still awesome이라는 글을 보고 생각나서 적습니다.

Python

위 글에서는 아래와 같은 코드를 제시하고 있습니다.

d = [{'value':1, 'title':'one'}, {'value':2}, {'value':3},
     {'value':4, 'title':'four'}, ]
s = sum([i['value'] for i in d])

하지만 사실 Python의 제너레이터 표현식(generator expressions)을 이용하면 효율도 더 높고 코드도 깔끔해집니다.

s = sum(i['value'] for i in d)

리스트를 생성하는 대신 반복자를 반환하고, 시퀀스의 원소를 하나씩 구할 때마다 i['value']를 평가하기 때문입니다.

Phunctional

또 위 글에서는 상대적으로 너저분한 아래의 PHP 코드를 비교하고 있는데요.

function extract_value($r) {
    return $r['value'];
}

$d = array(array('value'=>1, 'title'=>'one'), array('value'=>2),
           array('value'=>3), array('value'=>4, 'title'=>'four'));
$s = array_sum(array_map("extract_value", $d));

Phunctional을 사용하면 Python의 제너레이터 표현식처럼 지연 평가되는 시퀀스를 만들 수 있고, 또 extract_value() 같은 함수를 별도로 만들지 않아도 됩니다.

$s = reduce(def($a, $b)? $a['value'] + $b['value'] :fed(), $d);

연산자 함수자(functor)를 사용하여 좀더 줄여보겠습니다. map()이 등장합니다.

$s = reduce('+', map(def($i)? $i['value'] :fed(), $d));

map()Transformation이라는 클래스의 인스턴스를 반환하는데, 반복자로서 객체 자체는 아무런 평가도 되지 않은 상태이고, 그 반복자를 foreach문에 넣거나 reduce() 등의 함수에서 사용할 때에 이르러서야 평가하기 시작합니다.

인수로 받은 배열의 특정 키에 위치한 값을 반환하는 일은 접근자 표현식을 사용하면 훨씬 짧게 만들 수 있습니다.

$s = reduce('+', map('[value]', $d));

위에서 사용한 접근자 표현식은 '->member', '->methodCall()' 같은 형식도 지원하고, 그것들을 조합하여 '->member[key]->methodCall()["key2"]->member2'와 같이 복잡한 형태로도 사용할 수 있습니다.

Phunctional에서는 합을 구하는 sum()이라는 함수가 있으니 그것을 사용하면 좀더 짧게 표현할 수 있습니다.

$s = sum(map('[value]', $d));

sum() 함수는 두번째 인자로 함수자를 받는데, 그것을 이용하면 map()을 따로 쓰지 않아도 됩니다.

$s = sum($d, '[value]');

PHP에서도 꽤 짧게 쓸 수 있죠? 물론 Phunctional을 사용하지 않는다고 가정하면 짧게 쓰는데도 한계가 있습니다.

$s = array_sum(array_map(create_function('$i', 'return $i["value"];'), $d));

지저분하기도 하구요.

array_map(), create_function(), array_sum()은 PHP 내장 함수들이고, reduce(), map(), sum()이나 def()? ... :fed() 형식의 람다(lambda) 함수 표현식, 접근자 표현식은 Phunctional에서 제공하는 기능들입니다.

This entry was posted on February 15, 2008 at 9:43 AM. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

4 Responses to “Phunctional도 좋아요”

  1. 디토 Says:

    SELECT SUM(value) FROM d

    물론 농담입니다. =3

  2. Hong, MinHee (DAHLIA) Says:

    네, SQL의 SELECTmap, WHEREfilter, aggregate는 reduce로 볼 수 있겠죠.

  3. Jungwoo Song Says:

    Python is steel awesome -> Python is still awesome

  4. Hong, MinHee (DAHLIA) Says:

    Python is steel awesome -> Python is still awesome

    헐. 이걸 왜 아무도 발견 못했을까?

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