2010-01-28 3 views
4

패키지 A에 제네릭을 정의하고 CLOS의 패키지 B에이 제네릭에 대한 메소드를 제공하는 올바른 방법은 무엇입니까?Common Lisp에서의 교차 패키지 defgeneric/defmethod?

미리 감사드립니다.

예 :

(defpackage :common (:use :cl)) 
(in-package :common) 
(defgeneric compare (a b)) 

(defmethod compare ((a number) (b number)) 
    (cond ((< a b) -1) 
     ((= a b) 0) 
     (T 1))) 

(defpackage :a (:use :cl)) 
(in-package :a) 

(defclass foo (a b)) 

(defmethod compare ((x foo) (y foo)) ...) 
; SBCL isn't able to access this method via the common package 

답변

8

방법 및 기능 패키지에 속해 있지 않습니다. 기호는 패키지에 속합니다.

(defpackage :common (:use :cl)) 
(in-package :common) 
(defgeneric compare (a b)) 

(defmethod compare ((a number) (b number)) 
    (cond ((< a b) -1) ((= a b) 0) (T 1))) 

(defpackage :a (:use :cl)) 
(in-package :a) 

(defclass foo (a b)) 

A가 현재 패키지 인 경우 common :: compare를 작성하여 패키지 COMMON의 내보내기되지 않은 기호 COMPARE에 액세스해야합니다. 공통 패키지에서 내 보낸 비교하면

(defmethod common::compare ((x foo) (y foo)) ...) 

, 당신은 쓸 수 :

(defmethod common:compare ((x foo) (y foo)) ...) 

비교 패키지 공통 및 패키지 것 '사용'패키지 COMMON에서 내 보낸 경우에, 당신은 쓸 수 :

(defmethod compare ((x foo) (y foo)) ...) 
+0

대단히 감사합니다! 정확히 내가 예상했던 것. – Damg