перекрестный пакет defgeneric / defmethod в Common Lisp? - PullRequest
4 голосов
/ 28 января 2010

Как правильно определить универсальный пакет в пакете A и предоставить метод для этого универсального пакета в пакете B в CLOS?

Заранее спасибо!

Пример:

(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

1 Ответ

8 голосов
/ 28 января 2010

Методы и функции не относятся к пакетам. Символы принадлежат пакетам.

(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 для доступа к неэкспортированному символу COMPARE пакета COMMON.

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