gpt4 book ai didi

lisp - Common Lisp 中的跨包 defgeneric/defmethod?

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:46 24 4
gpt4 key购买 nike

在 CLOS 的包 A 中定义泛型并在包 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

最佳答案

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

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

关于lisp - Common Lisp 中的跨包 defgeneric/defmethod?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2156540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com