4

パッケージAでジェネリックを定義し、CLOSのパッケージBでこのジェネリックのメソッドを提供する正しい方法は何ですか?

前もって感謝します!

例:

(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
4

1 に答える 1

8

メソッドと関数はパッケージに属しません。シンボルはパッケージに属します。

(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 を記述して、パッケージ COMMON のエクスポートされていないシンボル COMPARE にアクセスする必要があります。

(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)) ...)   
于 2010-01-28T17:40:04.857 に答える