我使用Emacs作为我的Common (确切地说,是SBCL)编辑器,带有黏液。我按照这里的指令设置了Quicklisp,并检查它是否在黏液之外工作,一切都很好--我可以抓取和下载代码,包括它,所有的东西。
现在,我试图在Emacs中使用编译/加载File命令作为一个源文件,其顶部有以下内容:
(ql:quickload "priority-queue")
(defpackage :tournament
(:use :cl :priority-queue))
(in-package :tournament)现在,再一次,不是在黏液中,这件事很好。然而,在黏液中,我得到以下形式的错误:
The name "PRIORITY-QUEUE" does not designate any package.
[Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR]当然还有回溯。我是不是错过了什么特别的东西?我使用来自Emacs的package-install安装了slime,我的.emacs文件中有以下代码来设置它:
(setq inferior-lisp-program "/usr/local/bin/sbcl")
(require 'slime)
(slime-setup)发布于 2014-05-15 14:21:17
这是由于编译和加载的不同时间而发生的。
编译时,不计算普通函数调用(如ql:quickload)。当编译器试图处理defpackage表单(它不是普通函数调用,而是在编译时有副作用的宏)时,加载“优先级队列”的函数没有被调用,包也不可用。
如果加载文件而不是编译和加载,则不会看到这一点,因为load在加载时评估每个表单。
有几种选择可供选择。最简单的方法是将对ql:quickload的调用封装在eval-when中。
(eval-when (:compile-toplevel :load-toplevel :execute)
(ql:quickload "priority-queue"))我更喜欢为我的项目定义一个系统,不管这个系统多么小,所以我会创建一个tournament.asd文件,如下所示:
(asdf:defsystem #:tournament
:depends-on (#:priority-queue)
:serial t
:components ((:file "tournament.lisp")))我会把它放在~/quicklisp/local-projects/锦标赛/(连同tournament.lisp一起)中,并在repl中使用(ql:quickload "tournament")来开始并加载它。
我经常使用后一种设置,以至于我编写了一个名为速成工程的Lisp程序。
https://stackoverflow.com/questions/23676072
复制相似问题