这是在包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
有帮助吗?

解决方案

方法和功能不属于包。符号属于包。

(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是当前包,则需要写入共同::比较访问的非导出符号COMPARE包COMMON的。

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

如果比较来自包COMMON已出口,则可以写成:

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

如果比较来自包COMMON已出口并打包一个将“使用”包COMMON,那么你可以写:

(defmethod compare ((x foo) (y foo)) ...)   
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top