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

标签 package common-lisp sbcl asdf

我正在使用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) 应该可以工作。

关于package - 重新定义已删除的包 (Common Lisp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61298304/

相关文章:

lisp - 'cond' 能否完全替代 'if' 语句?

common-lisp - 如何在 sbcl 中存储映射 tmpfs 文件?

lisp - Common Lisp 对象系统 (CLOS) 是否支持 duck-typing?

macos - Hunchentoot 1.0 仅返回空响应

common-lisp - 为什么我需要评估新 REPL 的 defpackage?

java - 从包中获取所有类

linux - 为 OpenStreetMap 构建图 block 服务器时找不到包 apache2-dev-tile

common-lisp - 如何在普通的 lisp 中创建一个位数组?

python - 使用 Python .pth 文件假设无权访问 site-packages 目录

python - 打包和argparse