Переопределение удаленного пакета (Common Lisp) - PullRequest
2 голосов
/ 19 апреля 2020

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

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

Ответы [ 2 ]

1 голос
/ 02 мая 2020

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

1 голос
/ 29 апреля 2020

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

...