13

我已经使用 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]

看来我必须(require :PNG)在编译我的包之前调用 REPL。

require在不手动调用REPL的情况下,我需要做什么才能使编译器可以使用 CL-PNG 包?

更新:我正在使用 SBCL。

4

1 回答 1

15

您混淆了两个独立的概念: asystem和 a package。A package由 Common Lisp 标准定义,它是符号的集合,是控制其可见性和使用的一种方式。Asystem不是由标准定义的,它是由 引入的概念ASDF,它是元数据的集合,用于管理单个项目中的文件相互依赖关系,以便能够正确编译和加载它。Quicklisp构建在上面,ASDF提供了一种分发项目的方式,以ASDF systems的形式描述。

因此,当您安装 ( quickload) a system,称为PNG,这并不意味着该系统有一个包,称为PNG。系统是否定义了任何包(通常它定义了一个,甚至几个)以及如何调用它们由其作者决定。大多数项目将具有package.lisppackages.lisp文件,其中package定义了它们的 s。

但是在CL-PNG你正在加载的系统的情况下,它实际上定义了包PNG,它应该在你之后的运行进程中可用quickload。但是你应该在每次启动 Lisp 系统时加载它。ASDF提供了一种定义对CL-PNG系统的依赖的方法,这样你就可以只加载你自己的 systemsystem它所依赖的所有 s 都会自动加载,使package你想要使用的所有 s 都可用。

于 2012-06-23T18:39:33.007 回答