我发现我的软件包在delete
隐藏common-lisp package
时出现问题。我尝试了各种类型的shadowing
,但它们都没有为我工作。我想我错误地使用它,但仍然无法使它发挥作用。
我缩短了代码只是为了显示问题部分
此解决方案抛出错误:从包COMMON-LISP中重新定义宏DELETE。
(in-package "CL-USER")
(defpackage :simple-db
(:use :common-lisp)
(:shadow :delete)
(:export :delete))
另一个解决方案抛出错误:" SIMPLE-DB"中的重复符号defpackage:" DELETE"。
(in-package "CL-USER")
(defpackage :simple-db
(:use :common-lisp)
(:shadow :delete)
(:export :delete)
(:shadowing-import-from :simple-db :delete))
答案 0 :(得分:3)
您遇到的问题可能不在您的软件包定义中(第一个很好),它位于要使用您的软件包的软件包中,而也使用CL
。这些包最终会引用CL:DELETE
和 SIMPLE-DB:DELETE
。根据你的定义:
(defpackage :simple-db
(:use :common-lisp)
(:shadow :delete)
(:export :delete))
然后,任何想要使用 {em> SIMPLE-DB
和 CL
的软件包都会出错。
(defpackage :simple-db-user
;; this is an error
(:use :common-lisp :simple-db))
如果你只是说CL-USER
,你也会在任何包中看到这个(例如(use-package :simple-db)
)。
解决此错误的传统方法是使用SHADOWING-IMPORT
选择所需的符号:
(defpackage :simple-db-user
(:use :common-lisp :simple-db)
(:shadowing-import-from :simple-db :delete))
或者,在现有的包中:
(shadowing-import '(:delete) :simple-db)
有(我认为)更好的解决方案,涉及定义“喜欢”CL
但重新定义某些符号的包,然后将其视为突变CL
包,但这些解决方案需要宏观,使他们易于使用,我不会在这里给。
答案 1 :(得分:2)
我没有看到问题:
* (cl:defpackage :simple-db
(:use :common-lisp)
(:shadow :delete)
(:export :delete))
#<PACKAGE "SIMPLE-DB">
* (defun simple-db:delete (foo) foo)
SIMPLE-DB:DELETE
* (describe 'simple-db:delete)
SIMPLE-DB:DELETE
[symbol]
DELETE names a compiled function:
Lambda-list: (FOO)
Derived type: (FUNCTION (T) (VALUES T &OPTIONAL))
Source form:
(SB-INT:NAMED-LAMBDA SIMPLE-DB:DELETE
(FOO)
(BLOCK SIMPLE-DB:DELETE FOO))