3

我已将 Quicklisp 设置为在 SBCL 运行时运行,并将以下行添加到我试图在其中使用priority-queue的文件顶部(正如我之前的问题的答案中所建议的那样,Common Lisp 的优先级队列?)。但是,当我尝试使用它时,我收到来自 SBCL 的错误,说priority-queue未定义来自的函数!我错过了什么?

作为参考,我试着写这样的东西:

(ql:quickload "priority-queue")

(defparameter *heap* (make-pqueue #'<))

我收到一个错误,说make-pqueue没有定义。

4

1 回答 1

5

在普通的 lisp 中,任何被命名的东西(变量、函数、宏)都附加到符号上。在这种情况下,您有一个附加到符号的函数make-pqueue。使用包将符号彼此分开。这将冲突保持在最低限度,并且还允许包未导出的内部变量/函数之类的东西。

听起来您需要做以下三件事之一:

  1. 在函数前使用包名:(priority-queue:make-pqueue #'<). 如果您希望阅读您的源代码的人确切地知道正在运行什么代码,则此方法很好。但是,如果您多次调用该包,它会变得很麻烦。
  2. 使用priority-queue您所在的当前包中的包:

    (use-package :priority-queue)
    (make-pqueue #'<)
    

    这样做是将包中的每个导出符号导入priority-queue到您所在的当前包中(很可能cl-user)。虽然这有利于测试,但您通常希望创建自己的包。见下一项。

  3. 定义你自己的使用优先队列的包:

    (defpackage :queue-test (:use :cl :priority-queue))
    (in-package :queue-test)
    (make-pqueue #'<)
    

定义自己的包一开始似乎需要做很多工作,但你会开始喜欢你得到的分离,尤其是当你开始将不同的代码片段集成在一起时。

于 2014-05-12T23:23:36.903 回答