Резюме
Моя основная рекомендация - иметь отдельные пакеты, содержащие пользовательские команды и код вашего Лисп.
Вы не должны создавать отдельный пакет для каждого файла Lisp, который у вас есть.
Подробнее
Вам нужен in-package
macro (это не функция !), Чтобы гарантировать, что ваш код находится в
правильный пакет, потому что
defpackage
просто создает
пакет, он не изменить
*package*
.
Таким образом, я предлагаю следующее:
Файлы
game.asd
(asdf:defsystem "game"
:depends-on (#:cl-ppcre)
:components ((:file "package")
(:file "game" :depends-on ("package"))
(:file "commands" :depends-on ("package"))))
package.lisp
(defpackage :game
(:use :cl :cl-ppcre))
game.lisp
(in-package #:game)
...
commands.lisp
(in-package #:game)
...
(defconstant *commands-package* (make-package '#:commands :use nil))
, а затем используйте intern
для добавления
команды *commands-package*
и find-symbol
, чтобы найти их.
(defun test-command ()
(format t "test-command~%")
(start))
(intern 'test-command *commands-package*)
Вы также можете определить свой собственный макрос для этого:
(defmacro defcommand (name arglist &body body)
`(progn
(intern (symbol-name ',name) *commands-package*)
(defun ,name ,arglist ,@body)))
(defcommand test-command ()
(format t "test-command~%")
(start))
Nitpicks