Вывод REPL в заданный пакет после компиляции и загрузки (Common Lisp)

#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. Я добавил второй аргумент для желаемого конечного пакета, и он отлично работает. Спасибо и за другие указания.