Common lisp 我可以(asdf:load system:foo),但asdf仍然抱怨'&引用;"富",;不';t指定一个包';

Common lisp 我可以(asdf:load system:foo),但asdf仍然抱怨'&引用;"富",;不';t指定一个包';,common-lisp,sbcl,quicklisp,asdf,Common Lisp,Sbcl,Quicklisp,Asdf,为了最终开始使用asdf进行我的lisp涂鸦,我尝试建立一个简单的示例。这些文件是 ; contents of example.asd (asdf:defsystem "example" :name "example" :depends-on ("foo") :components ((:file "example"))) 及 (其中“foo”实际上是“cl-wav”,但问题仍然存在于我在本地安装的任何软件包中) 现在,即使跑步 (asdf:load-system :foo)

为了最终开始使用asdf进行我的lisp涂鸦,我尝试建立一个简单的示例。这些文件是

; contents of example.asd
(asdf:defsystem "example"
   :name "example"
   :depends-on ("foo")
   :components ((:file "example")))

(其中“foo”实际上是“cl-wav”,但问题仍然存在于我在本地安装的任何软件包中)

现在,即使跑步

(asdf:load-system :foo)
当我尝试评估时,它是有效的

(asdf:make :example)
我收到以下错误消息:

The name "FOO" does not designate any package.
我做错了什么


在上下文中,我的asdf版本是“3.1.5”,包“foo”安装了(最新版本的)quicklisp,所有这些都发生在SBCL 1.3.20中。

asdf系统与包不同。系统只是将一组文件组合到单个应用程序或库中的一种方式,可以使用Quicklisp轻松编译、加载、测试或安装这些文件。一个系统中可能有多个包(或者甚至没有,尽管这很奇怪)。通常库有一个与系统同名的“main”包,但这不是必需的

在这种情况下,系统
cl-wav
定义了一个名为
wav
的包,因此您需要在包定义中使用它。对于库作者来说,最好将包命名为
CL-WAV
,并使用
WAV
作为昵称,但他们没有这样做

(defpackage :example
  (:use :cl :asdf :wav))

系统名称不必与系统中任何包的名称相同。系统
cl-wav
有一个名为
wav
的包,因此您需要使用
(:use:wav…
)来使用它。您是对的,解决了它!我仍然不知道为什么在我之前尝试这个时,它不能用“zpng”而不是“cl wav”;它现在也可以与“zpng”一起使用。一定错过了什么。请回答,@jkiiski
(defpackage :example
  (:use :cl :asdf :wav))