我使用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。
答案 0 :(得分:14)
您混淆了两个不同的概念:system
和package
。 package
由Common Lisp标准定义,它是符号的集合,是控制其可见性和使用的一种方式。 system
没有被标准定义,它是ASDF
引入的概念,它是一个元数据集合,用于管理单个项目中的文件相互依赖性,以便能够正确编译和加载它。 Quicklisp
构建于ASDF
之上,以提供分发项目的方式,以ASDF system
s的形式描述。
因此,当您安装(quickload
)名为system
的{{1}}时,这并不意味着此系统有一个名为PNG
的程序包。系统是否定义任何包(通常它定义一个包,甚至几个包)以及它们的调用方式由作者自行决定。大多数项目都会有PNG
或package.lisp
个文件,其中packages.lisp
已定义。
但是在加载package
系统的情况下,它实际上定义了包CL-PNG
,并且在PNG
之后它应该在运行过程中可用。但是每次启动Lisp系统时都应该以某种方式加载它。 quickload
提供了一种定义ASDF
系统依赖关系的方法,因此您只能加载您自己的 CL-PNG
以及所有system
它依赖于将自动加载,使您想要使用的所有system
都可用。