В настоящее время я пытаюсь понять, как Common Lisp управляет своими пакетами и модулями.
Рассмотрим этот код:
(in-package :cl-user)
(ql:quickload :cl-who)
(ql:quickload :hunchentoot)
(ql:quickload :parenscript)
(defpackage :retro-games
(:use :cl :cl-who :hunchentoot :parenscript))
(in-package :retro-games)
(defclass game ()
((name :initarg :name)
(votes :initform 0)))
Когда я создаю буфер Slime, а затем запускаю этот код в другом буфере, установленном в режим Slime, я вижу некоторые отпечатки в первом буфере, который *slime-repl sbcl*
:
Загрузить 1 систему ASDF: cl-who ; Загрузка "cl-кто"
Чтобы загрузить "parenscript": Загрузите 1 систему ASDF: parenscript ; Загрузка "скобки"..
Чтобы загрузить «hunchentoot»: Загрузите 1 систему ASDF: hunchentoot ; Загрузка "хунчентута"..............
То есть, кажется, что между двумя буферами происходит какой-то «разговор». Однако, если я попытаюсь запустить (make-instance game("Chess"))
, я получу ошибку, потому что пакет CL-USER
не знает о классе game
.
С другой стороны, если я запускаю (in-package :retro-games)
в буфере slime repl sbcl
, я могу запустить (make-instance game("Chess"))
.
Вопрос в том, как Common Lisp организует свою работу с пакетами? В связи с этим, в чем разница между буфером, находящимся в slime repl sbcl
, и буфером, находящимся в slime-mode
?
Пакеты вообще похожи на виртуальные среды Python? То есть где в моем случае устанавливаются CL-WHO
, HUNCHENTOOT
и PARENSCRIPT
? Есть ли у меня выбор?