Я сталкиваюсь с этой проблемой много раз, когда обнаружил, что решение использует простой синтаксис ядра
User::where('name','ABC')
->whereRaw("(age = 25 OR age = 62) AND (position = 'manager' )")
->get();
Моя основная рекомендация заключается в том, чтобы у вас было отдельных пакетов , которые содержат пользовательские команды и которые содержат ваш код на Лиспе.
Вам не нужно создавать отдельный пакет для каждого имеющегося у вас файла 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
.