Переопределение удаленного пакета (Common Lisp)

Я использую delete-package как простой способ удалить множество старых (указанных пользователем) имен переменных перед загрузкой проекта обратно после определенных правок в файлах пакета. (В противном случае новые значения могут быть заменены старыми значениями для тех имен переменных, которые определены конечным пользователем.) Но 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">.

Откуда ошибка? Можно ли это исправить, сохранив прежний функционал?


person davypough    schedule 19.04.2020    source источник


Ответы (2)


Создайте отдельный пакет для хранения определяемых пользователем символов, например (defpackage :us), в дополнение к рабочему пакету. (:use :cl) не требуется, так как пакет содержит только данные. Установите пользовательские символы, используя (in-package :us) при загрузке пользовательских файлов, intern в :us программно или прямую ссылку с префиксом пакета. Доступ к символам с префиксом пакета. После этого (delete-package :us) должен работать.

person davypough    schedule 29.04.2020

По сути, SBCL может удалять и воссоздавать пакеты с тем же именем. Сообщение об ошибке указывает, что текущий пакет (*PACKAGE*) был удален. Попробуйте убедиться, что текущий пакет является другим пакетом, например. CL-USER, при удалении вашего пакета.

person GuentherT    schedule 02.05.2020