cross-pacchetto defgeneric / defmethod in Common Lisp?
-
23-09-2019 - |
Domanda
Qual è il modo giusto per definire un generico nel pacchetto A e per fornire un metodo per questo generico pacchetto di B in CLOS?
Grazie in anticipo!
Esempio:
(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
Soluzione
Metodi e funzioni non appartengono a pacchetti. I simboli appartengono a pacchetti.
(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))
Se A è il pacchetto corrente, quindi è necessario scrivere comuni :: confronta per accedere al simbolo non esportato COMPARE del pacchetto comune.
(defmethod common::compare ((x foo) (y foo)) ...)
Se COMPARE è stato esportato dal pacchetto comune, allora si potrebbe scrivere:
(defmethod common:compare ((x foo) (y foo)) ...)
Se COMPARE è stato esportato dal pacchetto comune e il pacchetto Un pacchetto avrebbe 'uso' comune, allora si potrebbe scrivere:
(defmethod compare ((x foo) (y foo)) ...)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow