Создание REPL в конечном итоге в заданном пакете после компиляции и загрузки (Common Lisp) - PullRequest
1 голос
/ 18 марта 2019

Я использую (asdf:load-system "app" :force t) в REPL для обработки ASD-файла, содержащего некоторые определения пакета и (asdf:defsystem "app" ...), указывающего file: компоненты. После загрузки REPL находится в пакете: cl-user. Как сделать так, чтобы REPL попал в другой пакет? Добавление (in-package: my-pkg) в различные места (например, ASD или компоненты) не сработало.

1 Ответ

2 голосов
/ 18 марта 2019

Изменения пакета во время загрузки или операции компиляции не изменяют текущий пакет для REPL.Это было бы очень раздражающим при обычном использовании.Системы также не соответствуют пакетам 1-к-1, поэтому может не быть пакета с одинаковым именем, и система может иметь несколько пакетов.Однако для удобства разработки вы можете добавить функцию в ваш файл инициализации (~/.sbclrc для SBCL), которая загружает систему и устанавливает *PACKAGE* для пакета с тем же именем.Например,

(require :asdf) ;Quicklisp also requires ASDF, so you could put this after its init too
(defun l (system-name)
  (asdf:load-system system-name)
  (setf *package* (find-package system-name)))

Функция будет в пакете CL-USER.Поскольку это только для разработки, ошибки для несуществующих систем или пакетов могут обрабатываться в интерактивном режиме.Обратите внимание, что вы должны вызывать его, используя ключевое слово для имени, а не строку, или, в качестве альтернативы, строковый регистр имени перед вызовом FIND-PACKAGE.

...