重新定义已删除的包(Common Lisp)
Redefining a Deleted Package (Common Lisp)
我使用 delete-package
作为一种简单的方法来解除大量旧的(用户指定的)变量名,然后在对包文件进行某些编辑后重新加载项目。 (否则,新值可以 push
编辑到最终用户定义的那些变量名称的旧值上。)但是当我在删除后尝试重新加载时 SBCL 抱怨。
在一次性加载一个 init.lisp
文件后,该文件设置了 Quicklisp、ASDF 并安装了一些 Quicklisp 库,然后我使用 (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">.
错误来自哪里?可以修复它,保留相同的功能吗?
除了工作包之外,创建一个单独的包来保存用户定义的符号,比如 (defpackage :us)
。 (:use :cl)
不是必需的,因为包仅包含数据。在加载用户文件时使用 (in-package :us)
安装用户符号,以编程方式将 intern
设置为 :us
,或者使用包前缀直接引用。使用包前缀访问符号。 (delete-package :us)
然后应该工作。
从根本上说,SBCL 可以删除和重新创建具有相同名称的包。错误信息表示当前包(*PACKAGE*
)已被删除。尝试确保当前包是不同的包,例如CL-USER,删除您的包时。
我使用 delete-package
作为一种简单的方法来解除大量旧的(用户指定的)变量名,然后在对包文件进行某些编辑后重新加载项目。 (否则,新值可以 push
编辑到最终用户定义的那些变量名称的旧值上。)但是当我在删除后尝试重新加载时 SBCL 抱怨。
在一次性加载一个 init.lisp
文件后,该文件设置了 Quicklisp、ASDF 并安装了一些 Quicklisp 库,然后我使用 (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">.
错误来自哪里?可以修复它,保留相同的功能吗?
除了工作包之外,创建一个单独的包来保存用户定义的符号,比如 (defpackage :us)
。 (:use :cl)
不是必需的,因为包仅包含数据。在加载用户文件时使用 (in-package :us)
安装用户符号,以编程方式将 intern
设置为 :us
,或者使用包前缀直接引用。使用包前缀访问符号。 (delete-package :us)
然后应该工作。
从根本上说,SBCL 可以删除和重新创建具有相同名称的包。错误信息表示当前包(*PACKAGE*
)已被删除。尝试确保当前包是不同的包,例如CL-USER,删除您的包时。