common-lisp - Quicklisp:使用加载的库

标签 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 未定义。

最佳答案

在 common 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 #'<)
    

定义您自己的包一开始似乎需要大量工作,但您会开始喜欢这种分离,特别是当您开始将不同的代码片段集成在一起时。

关于common-lisp - Quicklisp:使用加载的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23619181/

相关文章:

lisp - 查找 Common Lisp 库

emacs - 在 ALLEGRO-CL 免费版中安装 Quicklisp 库

package - SBCL - 包在加载时锁定所有 Quicklisp 库?

LISP编程

lisp - 如何从 lisp 中的字符串列表创建递归嵌套的列表

html - 从 Common Lisp 在浏览器中打开 HTML 页面

json - 如何使用 cl-json 库将 json-string 转换为 CLOS 对象?

lisp - 如何在类Unix操作系统下方便的运行SBCL代码?

common-lisp - 有没有办法捕捉到 Common Lisp 包被定义的时刻?