#common-lisp #read-eval-print-loop
#common-lisp #цикл чтения, оценки и печати
Вопрос:
Я использую (asdf:load-system "app" :force t)
at REPL для обработки файла ASD, содержащего некоторые определения пакетов и (asdf:defsystem "app" ...)
указывающего файл:components. После загрузки REPL находится в пакете :cl-user. Как вы можете сделать так, чтобы REPL вместо этого оказался в другом пакете. Добавление (in-package:my-pkg) в различные места (например, ASD или компоненты) не сработало.
Ответ №1:
Изменения пакета во время операции загрузки или компиляции не изменяют текущий пакет для REPL. Это было бы очень раздражающим при обычном использовании. Системы также не соответствуют пакетам 1 к 1, поэтому пакетов с одинаковым именем может не быть, и в системе может быть несколько пакетов. Однако для удобства разработки вы можете добавить функцию в свой init-файл ( ~/.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
-package. Поскольку это предназначено только для разработки, ошибки для несуществующих систем или пакетов могут обрабатываться в интерактивном режиме. Обратите внимание, что вы должны вызывать его, используя ключевое слово для имени, а не строку, или, альтернативно, строковое значение имени перед вызовом FIND-PACKAGE
.
Комментарии:
1. Я добавил второй аргумент для желаемого конечного пакета, и он отлично работает. Спасибо и за другие указания.