перекрестный пакет defgeneric/defmethod в Common Lisp?
-
23-09-2019 - |
Вопрос
Как правильно определить дженерик в пакете 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
Решение
Методы и функции не принадлежат пакетам.Символы принадлежат пакетам.
(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)) ...)
Не связан с StackOverflow