Quicklisp:使用加载的库

时间:2014-05-12 21:29:50

标签: common-lisp quicklisp

我已经设置了Quicklisp以便在SBCL运行时运行,并将以下行添加到我的文件顶部,我尝试使用priority-queue library(如答案中所示)我之前的问题,Priority queue for Common Lisp?)。但是,当我尝试使用它时,我从SBCL收到错误,说priority-queue的函数没有定义!我错过了什么?

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

(ql:quickload "priority-queue")

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

我收到一条错误消息,指出make-pqueue未定义。

1 个答案:

答案 0 :(得分: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 #'<)
    
  4. 首先定义自己的软件包似乎很多工作,但是你会开始喜欢你得到的分离,特别是如果你开始将不同的代码组合在一起。