What is the right way to define a generic in package A and to provide a method for this generic in package B in CLOS?
Thank you in advance!
Example:
(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
Methods and functions don't belong to packages. Symbols belong to 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))
If A is the current package, then you need to write common::compare to access the non-exported symbol COMPARE of package COMMON.
(defmethod common::compare ((x foo) (y foo)) ...)
If COMPARE has been exported from package COMMON, then you could write:
(defmethod common:compare ((x foo) (y foo)) ...)
If COMPARE has been exported from package COMMON and package A would 'use' package COMMON, then you could write:
(defmethod compare ((x foo) (y foo)) ...)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With