重新定义已删除的包(Common Lisp)

Posted

技术标签:

【中文标题】重新定义已删除的包(Common Lisp)【英文标题】:Redefining a Deleted Package (Common Lisp) 【发布时间】:2020-08-01 12:42:38 【问题描述】:

我使用delete-package 作为一种简单的方法来取消大量旧的(用户指定的)变量名,然后在对包文件进行某些编辑后重新加载项目。 (否则,新值可能会将 pushed 附加到最终用户定义的那些变量名的旧值上。)但是当我在删除后尝试重新加载时,SBCL 会抱怨。

在一次性加载一个设置 Quicklisp、ASDF 并安装一些 Quicklisp 库的init.lisp 文件后,我使用(progn (asdf:load-system “my-project”) (in-package :my-package)) 加载项目,其中项目定义my-project.asd 文件包含

(when (find-package :my-package)
  (delete-package :my-package))

(defpackage :my-package
  (:use :cl))

(asdf:defsystem "my-project"
   …)

这一切在第一次加载时运行良好,但在项目的第二次加载时出现问题,因为

*PACKAGE* can't be a deleted package: It has been reset to #<PACKAGE "COMMON-LISP-USER">.

错误来自哪里?能否修复它,保留相同的功能?

【问题讨论】:

【参考方案1】:

创建一个单独的包来保存用户定义的符号,例如 (defpackage :us) 除了工作包。 (:use :cl) 不是必需的,因为包只包含数据。在加载用户文件时使用(in-package :us) 安装用户符号,以编程方式将intern 安装到:us 中,或者使用包前缀直接引用。使用包前缀访问符号。然后(delete-package :us) 应该可以工作了。

【讨论】:

【参考方案2】:

基本上 SBCL 可以删除和重新创建具有相同名称的包。错误消息表明当前包 (*PACKAGE*) 已被删除。尝试确保当前包是不同的包,例如CL-USER,删除你的包时。

【讨论】:

以上是关于重新定义已删除的包(Common Lisp)的主要内容,如果未能解决你的问题,请参考以下文章

Common Lisp学习之七:LISP的面向对象编程

Common Lisp学习之七:LISP的面向对象编程

Common Lisp宏变量扩展

查找 Common Lisp 文件之间的依赖关系

android 在已删除的包中没有收到 Intent ACTION_PACKAGE_REMOVED

无法删除 MSVS 2019 中解决方案的已安装 Nuget 包