Вопрос

Как правильно определить дженерик в пакете 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)) ...)   
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top