2010-01-28 52 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