CALL-METHOD, MAKE-METHOD 로컬 매크로
CALL-METHOD, MAKE-METHOD 로컬 매크로 (call-method, make-method)
call-method와 make-method는 메서드 조합(method combination) 안에서만 쓰는 특수 목적 로컬 매크로예요. call-method는 메서드를 실제로 호출하는 방식을 추상화해서 구현별 세부사항을 숨기고, make-method는 주어진 폼을 본문으로 하는 메서드 객체를 즉석에서 만들어 줍니다. 평소에 직접 쓸 일은 거의 없지만, 사용자 정의 메서드 조합을 만들 때 반드시 만나게 되는 도구예요.
문법 (Syntax)
call-method method &optional next-method-list => result*
make-method form => method-object
인자와 값 (Arguments and Values)
method— 메서드 객체이거나 리스트(아래 참고)이며, 평가되지 않아요.method-object— 메서드 객체예요.next-method-list— 메서드 객체들의 리스트이며, 평가되지 않아요.results— 메서드 호출이 돌려주는 값들이에요.
설명 (Description)
call-method 매크로는 메서드 조합에서 쓰여요. 메서드를 호출하는 구현 의존적인 세부사항을 숨겨요. call-method는 렉시컬 스코프를 가지며, 유효 메서드(effective method) 폼 안에서만 쓸 수 있어요.
call-method가 전역 환경에서 fbound인지 여부는 구현에 따라 달라요. 다만 재정의·그림자(shadowing)에 대한 제한은 COMMON-LISP 패키지에서 전역 환경에 fbound인 심볼들과 같아요. 유효 메서드 폼 밖에서 call-method를 쓰려 하면 결과는 정의되지 않아요.
call-method 매크로는 지정된 메서드를 호출하면서, 인자와 call-next-method·next-method-p의 정의를 함께 제공해요. call-method 호출이 make-method의 렉시컬 안쪽에 있으면 그 인자는 그 메서드에 제공된 것들이고, 그렇지 않으면 제네릭 함수에 제공된 인자들이에요. call-next-method·next-method-p의 정의는 지정된 next-method-list에 의존해요.
method가 리스트면, 그 첫 요소는 심볼 make-method이고 두 번째 요소는 폼이에요. 이런 리스트는, 메서드 함수의 본문이 그 폼인 메서드 객체를 지정해요.
next-method-list는 메서드 객체나 리스트를 담을 수 있어요. 리스트의 첫 요소는 심볼 make-method이고 두 번째 요소는 폼이어야 해요.
make-method를 쓸 수 있는 곳은 이런 두 자리뿐이에요. make-method와 함께 쓰는 폼은, call-method의 로컬 매크로 정의와 COMMON-LISP-USER 패키지에서 접근할 수 없는 심볼들이 이름 붙인 바인딩이 보강된 **널 렉시컬 환경(null lexical environment)**에서 평가돼요.
메서드가 쓸 수 있는 call-next-method 함수는 next-method-list의 첫 번째 메서드를 호출해요. 그 메서드 안에서 쓰는 call-next-method는 차례로 두 번째 메서드를 호출하고, 그렇게 next 메서드 리스트가 소진될 때까지 이어져요.
next-method-list가 주어지지 않으면, 메서드가 쓸 수 있는 call-next-method는 control-error 타입 오류를 신호하고, next-method-p는 nil을 돌려줘요.
예제 (Examples)
이 페이지에는 예제가 없어요.
영향 (Affected By)
없음.
예외 상황 (Exceptional Situations)
없음.
함께 보기 (See Also)
call-next-method,define-method-combination,next-method-p
참고 (Notes)
없음.