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이라는 사랑스러운 모델의 화보를 잡지에서 목격하고 충동적으로 개설을 결심하여 만든 곳인데—이름하야 선남선녀 블로그랄까? ㅎㅎㅎ

May 14th, 2007 at 11:12 AM
결국 수면 위로 올라온 “홍민희 선남선녀 블로그”!!
May 15th, 2007 at 5:28 PM
커…서태지씨 좋아하십니까? 개인적으로 저는 그분 노래중 몇개가 마음에 들던데..