2010-01-28 15 views
4

Quelle est la bonne façon de définir un générique dans le paquet A et de fournir une méthode pour ce générique dans le paquet B dans CLOS?cross-package defgeneric/defmethod dans Common Lisp?

Merci d'avance!

Exemple:

(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 

Répondre

8

Méthodes et fonctions ne font pas partie des paquets. Les symboles appartiennent à des packages.

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

Si A est le package en cours, alors vous devez écrire commun :: comparer pour accéder au symbole non exporté COMPARE du paquet COMMUN.

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

Si COMPARE a été exporté du paquet commun, alors vous pouvez écrire:

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

Si COMPARE a été exporté du paquet A COMMON et package serait paquet 'utilisation' COMMON, alors vous pourriez écrire :

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

Merci beaucoup! Exactement ce à quoi je m'attendais. – Damg