我目前正在尝试了解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-who”
加载“parenscript”:加载1个ASDF系统: parenscript;正在加载“parenscript”..
加载“hunchentoot”:加载1个ASDF系统: hunchentoot;正在加载“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
安装在哪里?我对此有什么选择吗?
答案 0 :(得分:3)
首先,试试(make-instance 'game :name "Chess")
。
请注意,Common Lisp在paarenthesis之间使用前缀表示法。因此,如果要调用类似foo("bar")
的函数,则为(foo "bar")
。
如果需要,您可以创建如下函数:
(defun new-game (game-name)
(make-instance 'game :name game-name))
如果您使用的是Quicklisp,请将软件包安装在您已安装quicklisp的位置。如果它安装在您的主文件夹中,则包应位于/home/user/quicklisp/dists/quicklisp/software/
。