Моя основная рекомендация заключается в том, чтобы у вас было отдельных пакетов , которые содержат пользовательские команды и которые содержат ваш код на Лиспе.
Вам не нужно создавать отдельный пакет для каждого имеющегося у вас файла Lisp.
Вам нужен макрос in-package
(это не функция !), Чтобы убедиться, что ваш код находится в правильном пакете, поскольку 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
[ 1147] (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))
Не переносить тело функции в явном виде progn
, потому что defun
делает это для вас.
find-symbol
находит symbol
, а не function
.
Не забудьте string-upcase
аргумент к find-symbol
.
Возможно проигнорировать ошибки, это находится только в странном месте для vb.net.
Откройте .vbproj файл с блокнотом или эквивалентом и найдите <NoWarn>, отмечают и добавляют идентификатор ошибки там.
в winforms 2008 года по умолчанию мне проигнорировали эти предупреждения уже.
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
При использовании Nant в сценарии сборки, у Вас мог бы просто быть он, переписывают версию до компиляции, и Вы не видели бы предупреждение, когда Вы работаете над своими локальными машинами.