Проблема с пакетной связью Common-Lisp

Я сталкиваюсь с этой проблемой много раз, когда обнаружил, что решение использует простой синтаксис ядра

User::where('name','ABC')
      ->whereRaw("(age = 25 OR age = 62) AND (position = 'manager' )")
      ->get();
2
задан sds 16 January 2019 в 16:49
поделиться

1 ответ

Резюме

Моя основная рекомендация заключается в том, чтобы у вас было отдельных пакетов , которые содержат пользовательские команды и которые содержат ваш код на Лиспе.

Вам не нужно создавать отдельный пакет для каждого имеющегося у вас файла 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))

Nitpicks

0
ответ дан sds 16 January 2019 в 16:49
поделиться