Koz*_*oss 3 common-lisp quicklisp
我已经设置了Quicklisp以便在SBCL运行时运行,并将以下行添加到我正在尝试使用该priority-queue库的文件顶部(正如我之前的问题的回答中所建议的,Common Lisp的优先级队列?).但是,当我尝试使用它时,我从SBCL收到错误,说priority-queue没有定义函数!我错过了什么?
作为参考,我试着写这样的东西:
(ql:quickload "priority-queue")
(defparameter *heap* (make-pqueue #'<))
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,说make-pqueue没有定义.
在常见的lisp中,任何被命名的(变量,函数,宏)都附加到符号上.在这种情况下,您有一个附加到符号的功能make-pqueue.使用包将符号彼此分开.这样可以将碰撞保持在最低限度,并且还允许包内未导出的内部变量/函数等内容.
听起来你需要做三件事之一:
(priority-queue:make-pqueue #'<).如果您希望阅读源代码的人确切知道正在运行的代码,那么此方法很有用.但是,如果你多次打电话给它,会很麻烦.使用当前priority-queue包中的包:
(use-package :priority-queue)
(make-pqueue #'<)
Run Code Online (Sandbox Code Playgroud)
这样做是将priority-queue包中的每个导出符号导入到您当前的包中(最有可能cl-user).虽然这对测试很有用,但您通常希望创建自己的包.见下一个项目.
定义您自己的使用优先级队列的包:
(defpackage :queue-test (:use :cl :priority-queue))
(in-package :queue-test)
(make-pqueue #'<)
Run Code Online (Sandbox Code Playgroud)一开始定义自己的软件包看起来很多,但是你会开始喜欢你得到的分离,特别是如果你开始将不同的代码片段集成在一起.