commmon-lisp包中的阴影(重新定义)符号最终会出错

时间:2018-04-22 11:56:59

标签: package lisp common-lisp shadowing redefine

我发现我的软件包在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))

2 个答案:

答案 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))