如何使用quicklisp安装的软件包?

时间:2012-06-23 17:30:42

标签: lisp common-lisp packages sbcl quicklisp

我使用quicklisp安装了CL-PNG软件包。

(ql:quicklisp 'png)

现在我想定义一个依赖于CL-PNG包的自己的包。像这样:

(defpackage :FOO
  (:use :CL :PNG)
  (:export :BAR))

编译时我收到此错误:

The name "PNG" does not designate any package.
   [Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR]

在编译我的软件包之前,我似乎必须在REPL上调用(require :PNG)

如果没有手动调用REPL上的require,我需要做什么才能使编译器可以使用CL-PNG包?

更新:我正在使用SBCL。

1 个答案:

答案 0 :(得分:14)

您混淆了两个不同的概念:systempackagepackage由Common Lisp标准定义,它是符号的集合,是控制其可见性和使用的一种方式。 system没有被标准定义,它是ASDF引入的概念,它是一个元数据集合,用于管理单个项目中的文件相互依赖性,以便能够正确编译和加载它。 Quicklisp构建于ASDF之上,以提供分发项目的方式,以ASDF system s的形式描述。

因此,当您安装(quickload)名为system的{​​{1}}时,这并不意味着此系统有一个名为PNG的程序包。系统是否定义任何包(通常它定义一个包,甚至几个包)以及它们的调用方式由作者自行决定。大多数项目都会有PNGpackage.lisp个文件,其中packages.lisp已定义。

但是在加载package系统的情况下,它实际上定义了包CL-PNG,并且在PNG之后它应该在运行过程中可用。但是每次启动Lisp系统时都应该以某种方式加载它。 quickload提供了一种定义ASDF系统依赖关系的方法,因此您只能加载您自己的 CL-PNG以及所有system它依赖于将自动加载,使您想要使用的所有system都可用。