Emacs SLIME和Quicklisp玩得不好

Emacs SLIME和Quicklisp玩得不好,emacs,sbcl,slime,quicklisp,Emacs,Sbcl,Slime,Quicklisp,我使用Emacs作为我的公共Lisp(确切地说是SBCL)编辑器,使用SLIME。我按照说明设置了Quicklisp,并检查它是否在SLIME之外工作,一切都很好——我可以抓取和下载代码,包括它,一切 现在,我尝试在Emacs中对源文件使用Compile/Load File命令,顶部有以下内容: (ql:quickload "priority-queue") (defpackage :tournament (:use :cl :priority-queue)) (in-package :

我使用Emacs作为我的公共Lisp(确切地说是SBCL)编辑器,使用SLIME。我按照说明设置了Quicklisp,并检查它是否在SLIME之外工作,一切都很好——我可以抓取和下载代码,包括它,一切

现在,我尝试在Emacs中对源文件使用Compile/Load File命令,顶部有以下内容:

(ql:quickload "priority-queue")

(defpackage :tournament
  (:use :cl :priority-queue))

(in-package :tournament)
现在,再一次,不是在粘液中,这很好。然而,在SLIME中,我得到以下形式的错误:

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)

这是因为编译和加载的时间是分开的

编译时,不计算普通函数调用(如
ql:quickload
)。当编译器试图处理
defpackage
表单(这不是一个普通的函数调用,而是一个在编译时有副作用的宏)时,加载“优先级队列”的函数未被调用,包不可用

如果加载文件而不是编译和加载,您将看不到这一点,因为加载会在加载每个表单时对其进行求值

有几个选项可用。最简单的方法是在
eval时将对
ql:quickload
的调用包装在
eval中,例如

(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/localprojects/tournament/(以及tournament.lisp)中,并在repl中使用
(ql:quickload“tournament”)
开始并加载它


我经常使用后一种设置,因此我编写了一个Lisp程序来为我完成它,名为。

这是因为编译和加载的时间是分开的

编译时,不计算普通函数调用(如
ql:quickload
)。当编译器试图处理
defpackage
表单(这不是一个普通的函数调用,而是一个在编译时有副作用的宏)时,加载“优先级队列”的函数未被调用,包不可用

如果加载文件而不是编译和加载,您将看不到这一点,因为加载会在加载每个表单时对其进行求值

有几个选项可用。最简单的方法是在
eval时将对
ql:quickload
的调用包装在
eval中,例如

(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/localprojects/tournament/(以及tournament.lisp)中,并在repl中使用
(ql:quickload“tournament”)
开始并加载它

我经常使用后一种设置,因此我编写了一个Lisp程序来为我完成它,名为