Code Metaphor

Programming, Writing, Reading, Thoughts…

Metaphor에서 데코레이터

Python에는 데코레이터(decorator) 문법이라는 것이 있다.

@decorator
def func():
    pass

위 구문은 아래와 똑같은 동작을 한다.

def func():
    pass
func = decorator(func)

데코레이터 부분은 어떤 표현식이든 들어갈 수 있으므로 복잡한 것도 가능하다.

@i['am'].a().complex.decorator(expression)
def func():
    pass

위 코드는 아래처럼 동작한다.

def func():
    pass
func = i['am'].a().complex.decorator(expression)(func)

데코레이터 호출시 i['am'].a().complex.decorator(expression, func)처럼 인자 맨 끝에 낑겨 넣어서 호출하는 것이 아니라, 고차 함수(higher-order function)로 작용하는 것에 유의하자.

이와 같은 것은 Metaphor에서 어떻게 가능할까? 딱히 데코레이터 문법이 존재하지는 않지만, 일반 호출 구문으로도 비슷한 가독성을 얻을 수 있을 것 같다. 이전 포스트에서 설명했던 두번째 호출 구문을 사용하면 아래와 같이 작성할 수 있다.

decorator:
func = ():{
    # ...
}

위 코드는 아래와 동등한 코드이다.

decorator(func = (): {
    # ...
})

다른 점이라면 변수에 대입되기 전에 데코레이터가 적용되는 것이 아니라, 대입된 후에 적용된다는 것 정도. 아, Python의 데코레이터 구문은 함수 정의에만 사용할 수 있지만, Metaphor는 아무 표현식이나 다 집어삼킨다는 것도 다르다.

복잡한 예제 코드. (Metaphor 구현은 아직 하나도 된게 없으면서 의사 코드만 잔뜩 늘어나는 것 같다.)

i('am').a().complex.decorator(expression):
func = ():{
    # ...
}

인덱스 연산자—[]—를 호출 연산자—()—로 바꾼 것은, 아직 Metaphor에 인덱스 연산자를 추가할지 결정하지 못했기 때문. 위 코드는 아래와 동등하다.

i('am').a().complex.decorator(expression)(func = ()::{
    # ...
})

덧. 오밤중에 잠이 너무 안 와서 이런걸 다 올린다. 이 포스팅 말고도 이런 거나, 이런 것도 올렸다. 저 블로그는 내가 얼마 전에 Ali Michael이라는 사랑스러운 모델화보를 잡지에서 목격하고 충동적으로 개설을 결심하여 만든 곳인데—이름하야 선남선녀 블로그랄까? ㅎㅎㅎ

This entry was posted on May 14, 2007 at 2:16 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 “Metaphor에서 데코레이터”

  1. Heungsub Says:

    결국 수면 위로 올라온 “홍민희 선남선녀 블로그”!!

  2. Dote Endarson Says:

    커…서태지씨 좋아하십니까? 개인적으로 저는 그분 노래중 몇개가 마음에 들던데..

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