4

在包 A 中定义泛型并在 CLOS 中为包 B 中的泛型提供方法的正确方法是什么?

先感谢您!

例子:

(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
4

1 回答 1

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)) ...)   

如果 COMPARE 已经从包 COMMON 中导出,那么你可以这样写:

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

如果 COMPARE 已经从包 COMMON 中导出并且包 A 将“使用”包 COMMON,那么您可以编写:

(defmethod compare ((x foo) (y foo)) ...)   
于 2010-01-28T17:40:04.857 回答