Управление пакетами и модулями Common Lisp

В настоящее время я пытаюсь понять, как 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? Есть ли у меня выбор?


person MadPhysicist    schedule 06.10.2017    source источник
comment
Вы искали ответ в сети? на эту тему есть много отличного материала (например, «Practical Common Lisp — 21. Programming in the Large: Packages and Symbols» Питера Сейбеля gigamonkeys.com/book/).   -  person rsm    schedule 06.10.2017
comment
привет, не было необходимости в тегах python и emacs.   -  person Ehvince    schedule 07.10.2017
comment
Quicklisp отличается от виртуальных сред Python. Quicklisp собирает все библиотеки вместе, чтобы они работали вместе. См. это обсуждение. Если вам /нужен/ нравится venv, есть Qlot.   -  person Ehvince    schedule 07.10.2017


Ответы (1)


Сначала попробуйте (make-instance 'game :name "Chess"). Обратите внимание, что Common Lisp использует префиксную запись между скобками. Итак, если вы хотите вызвать функцию типа foo("bar"), это будет (foo "bar"). Если вы хотите, вы можете создать такую ​​​​функцию, как:

(defun new-game (game-name) (make-instance 'game :name game-name))

Если вы используете Quicklisp, пакеты могут быть установлены там, где вы установили quicklisp. Если он установлен в вашей домашней папке, пакеты должны находиться в /home/user/quicklisp/dists/quicklisp/software/.

person Vitor F.M.    schedule 06.10.2017