1

我发现我的包deletecommon-lisp package. 我尝试了各种类型的shadowing,但没有一个对我有用。我想我用错了,但仍然无法正常工作。

我缩短了代码只是为了显示问题部分

此解决方案引发错误:重新定义宏 DELETE 从包 COMMON-LISP 可见。

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

2 回答 2

4

您遇到的问题可能不在您的包定义中(第一个很好),它在想要使用您的包的包中,并且使用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-22T14:43:30.130 回答
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))
于 2018-04-22T12:12:45.767 回答