首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在commmon包中隐藏(重新定义)符号最终会导致错误。

在commmon包中隐藏(重新定义)符号最终会导致错误。
EN

Stack Overflow用户
提问于 2018-04-22 11:56:59
回答 2查看 393关注 0票数 1

我发现我的包在跟踪delete时遇到了来自common-lisp package的问题。我尝试过各种类型的shadowing,但没有一种适合我。我想我用错了,但还是没能成功。

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

此解决方案引发错误:重新定义公共LISP包中可见的宏删除。

代码语言:javascript
复制
 (in-package "CL-USER")

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

另一种解决方案会抛出错误:在"SIMPLE-DB“缺陷包中复制符号:"DELETE”。

代码语言:javascript
复制
 (in-package "CL-USER")

 (defpackage :simple-db
  (:use :common-lisp)
  (:shadow :delete)
  (:export :delete)
  (:shadowing-import-from :simple-db :delete))
EN

回答 2

Stack Overflow用户

发布于 2018-04-22 14:43:30

您遇到的问题可能不是包定义中的问题(第一个问题很好),而是在希望使用包的包中,以及在使用CL的包中。这些包最后都引用了CL:DELETESIMPLE-DB:DELETE。根据你的定义:

代码语言:javascript
复制
(defpackage :simple-db
  (:use :common-lisp)
  (:shadow :delete)
  (:export :delete))

然后,任何想同时使用SIMPLE-DBCL的包都会出现错误。

代码语言:javascript
复制
(defpackage :simple-db-user
  ;; this is an error
  (:use :common-lisp :simple-db))

如果您简单地说是CL-USER,那么您也会在任何包(例如(use-package :simple-db) )中看到这一点。

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

代码语言:javascript
复制
(defpackage :simple-db-user
  (:use :common-lisp :simple-db)
  (:shadowing-import-from :simple-db :delete))

或者,在现有的一揽子方案中:

代码语言:javascript
复制
(shadowing-import '(:delete) :simple-db)

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

票数 4
EN

Stack Overflow用户

发布于 2018-04-22 12:12:45

我不觉得有什么问题:

代码语言:javascript
复制
* (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))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49965645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档