Common Lisp包和模块管理

时间:2017-10-06 15:20:59

标签: common-lisp slime quicklisp

我目前正在尝试了解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-WHOHUNCHENTOOTPARENSCRIPT安装在哪里?我对此有什么选择吗?

1 个答案:

答案 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/