我已经设置了Quicklisp以便在SBCL运行时运行,并将以下行添加到我的文件顶部,我尝试使用priority-queue
library(如答案中所示)我之前的问题,Priority queue for Common Lisp?)。但是,当我尝试使用它时,我从SBCL收到错误,说priority-queue
的函数没有定义!我错过了什么?
作为参考,我试着写这样的东西:
(ql:quickload "priority-queue")
(defparameter *heap* (make-pqueue #'<))
我收到一条错误消息,指出make-pqueue
未定义。
答案 0 :(得分:5)
在常见的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 #'<)
首先定义自己的软件包似乎很多工作,但是你会开始喜欢你得到的分离,特别是如果你开始将不同的代码组合在一起。