我已将 Quicklisp 设置为在 SBCL 运行时运行,并将以下行添加到我尝试使用 priority-queue
library 的文件顶部。 (正如我之前的问题 Priority queue for Common Lisp? 的答案中所建议的)。但是,当我尝试使用它时,我从 SBCL 收到错误,指出 priority-queue
中的函数未定义!我错过了什么?
作为引用,我尝试写这样的内容:
(ql:quickload "priority-queue")
(defparameter *heap* (make-pqueue #'<))
我收到一条错误消息,指出 make-pqueue
未定义。
最佳答案
在 common lisp 中,任何被命名的东西(变量、函数、宏)都附加到一个符号上。在本例中,您有一个附加到符号 make-pqueue
的函数。 。符号通过包相互分离。这可以将冲突降至最低,并且还允许使用包未导出的内部变量/函数之类的内容。
听起来您需要执行以下三件事之一:
- 在函数前使用包名:
(priority-queue:make-pqueue #'<)
。如果您希望阅读源代码的人准确了解正在运行的代码,则此方法非常有用。但是,如果多次调用该包,可能会变得很麻烦。 使用
priority-queue
包在您当前所在的包中:(use-package :priority-queue) (make-pqueue #'<)
它的作用是导入
priority-queue
中的每个导出符号。打包到您当前所在的包中(很可能是cl-user
)。虽然这对于测试很有好处,但您通常希望创建自己的包。请参阅下一项。定义您自己的使用优先级队列的包:
(defpackage :queue-test (:use :cl :priority-queue)) (in-package :queue-test) (make-pqueue #'<)
定义您自己的包一开始似乎需要大量工作,但您会开始喜欢这种分离,特别是当您开始将不同的代码片段集成在一起时。
关于common-lisp - Quicklisp:使用加载的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23619181/