【问题标题】:Shadowing (redefining) symbol in commmon-lisp package ends up with errorscommon-lisp 包中的阴影(重新定义)符号最终出现错误
【发布时间】:2018-10-02 14:06:37
【问题描述】:

我发现我的包在从common-lisp package 映射delete 时出现问题。我尝试了各种类型的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))

【问题讨论】:

  • 第一种情况下哪个代码会抛出错误?

标签: package lisp common-lisp shadowing redefine


【解决方案1】:

你遇到的问题可能不在你的包定义中(第一个很好),它在想要使用你的包的包中,使用CL。这些包最终都引用了CL:DELETE SIMPLE-DB:DELETE。鉴于您的定义:

(defpackage :simple-db
  (:use :common-lisp)
  (:shadow :delete)
  (:export :delete))

然后任何想要使用 both SIMPLE-DB CL 的包都会出错。

(defpackage :simple-db-user
  ;; this is an error
  (:use :common-lisp :simple-db))

如果你简单地说(use-package :simple-db),你也会在任何包中看到这个(例如CL-USER)。

解决此错误的传统方法是使用SHADOWING-IMPORT 选择您想要的符号:

(defpackage :simple-db-user
  (:use :common-lisp :simple-db)
  (:shadowing-import-from :simple-db :delete))

或者,在现有包中:

(shadowing-import '(:delete) :simple-db)

(我认为)有更好的解决方案,其中涉及定义“类似”CL 的包,但重新定义了一些符号,然后您将其视为突变的CL 包,但这些解决方案需要宏观来制作它们易于使用,我不会在这里给出。

【讨论】:

    【解决方案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))
    

    【讨论】:

    • 我通过使用 (cl:defpackage ...) 让它工作,但它只是将这个问题转移到 defsystem
    • @dyouteotyi:你需要展示一个完整的可复制案例。
    猜你喜欢
    • 2012-04-02
    • 2020-08-01
    • 2011-12-24
    • 2021-04-04
    • 2019-08-08
    • 2020-09-11
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多