【问题标题】:cross-package defgeneric/defmethod in Common Lisp?Common Lisp 中的跨包defgeneric/defmethod?
【发布时间】:2011-01-10 12:32:42
【问题描述】:

在包 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

【问题讨论】:

    标签: lisp common-lisp clos


    【解决方案1】:

    方法和函数不属于包。符号属于包。

    (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)) ...)   
    

    【讨论】:

    • 非常感谢!完全符合我的预期。
    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多