我发现我的包在跟踪delete时遇到了来自common-lisp package的问题。我尝试过各种类型的shadowing,但没有一种适合我。我想我用错了,但还是没能成功。
我缩短了代码,只是为了显示问题的部分。
此解决方案引发错误:重新定义公共LISP包中可见的宏删除。
(in-package "CL-USER")
(defpackage :simple-db
(:use :common-lisp)
(:shadow :delete)
(:export :delete))另一种解决方案会抛出错误:在"SIMPLE-DB“缺陷包中复制符号:"DELETE”。
(in-package "CL-USER")
(defpackage :simple-db
(:use :common-lisp)
(:shadow :delete)
(:export :delete)
(:shadowing-import-from :simple-db :delete))发布于 2018-04-22 14:43:30
您遇到的问题可能不是包定义中的问题(第一个问题很好),而是在希望使用包的包中,以及在使用CL的包中。这些包最后都引用了CL:DELETE和SIMPLE-DB:DELETE。根据你的定义:
(defpackage :simple-db
(:use :common-lisp)
(:shadow :delete)
(:export :delete))然后,任何想同时使用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包,但这些解决方案需要宏观,使他们易于使用,我在这里不会给出。
发布于 2018-04-22 12:12:45
我不觉得有什么问题:
* (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))https://stackoverflow.com/questions/49965645
复制相似问题