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

Jan*_*ard 12 lisp packages sbcl common-lisp quicklisp

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

(ql:quicklisp 'png)
Run Code Online (Sandbox Code Playgroud)

现在我想定义自己的包,这取决于CL-PNG包.像这样:

(defpackage :FOO
  (:use :CL :PNG)
  (:export :BAR))
Run Code Online (Sandbox Code Playgroud)

编译时我收到此错误:

The name "PNG" does not designate any package.
   [Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR]
Run Code Online (Sandbox Code Playgroud)

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

如何在不手动调用requireREPL的情况下为编译器提供CL-PNG包,我该怎么办?

更新:我正在使用SBCL.

Vse*_*kin 15

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

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

但是对于CL-PNG你正在加载的系统,它实际上定义了包PNG,它应该在你运行后的运行过程中可用quickload.但是每次启动Lisp系统时都应该以某种方式加载它.ASDF提供了一种定义CL-PNG系统依赖关系的方法,这样你就可以只加载自己的系统 system,并且system它所依赖的所有系统都会自动加载,使package你想要使用的所有系统都可用.