2010-01-28 59 views
4

什麼是在包A中定義泛型並在CLOS中爲包B中的泛型提供一種方法的正確方法?Common Lisp中的跨包defmeneric/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)) ...) 

如果比較來自包COMMON已出口,那麼你可以寫:

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

如果對比已經從包裝COMMON和包A將「使用」包COMMON出口,那麼你可以寫:

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

非常感謝!正是我所期望的。 – Damg 2010-01-28 20:30:07