Defgenérico/DefMethod de pacote cruzado em Lisp comum?
-
23-09-2019 - |
Pergunta
Qual é a maneira certa de definir um genérico no pacote A e fornecer um método para este genérico no pacote B no fechamento?
Agradeço antecipadamente!
Exemplo:
(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
Solução
Métodos e funções não pertencem a pacotes. Os símbolos pertencem a pacotes.
(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 for o pacote atual, você precisará escrever Common :: Compare para acessar o símbolo não exportado Compare do pacote comum.
(defmethod common::compare ((x foo) (y foo)) ...)
Se a comparação foi exportada do pacote comum, você pode escrever:
(defmethod common:compare ((x foo) (y foo)) ...)
Se a comparação foi exportada do pacote comum e do pacote A 'usaria' o pacote comum, você pode escrever:
(defmethod compare ((x foo) (y foo)) ...)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow