SLIME和Quicklisp彼此之间并不好玩

时间:2014-05-15 10:48:18

标签: emacs sbcl slime quicklisp

我使用Emacs作为我的Common Lisp(SBCL,确切地说)编辑器,使用SLIME。我根据说明here设置了Quicklisp,并检查它是否在SLIME的外部工作,一切都很好 - 我可以抓取并下载代码,包含它,一切。

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

(ql:quickload "priority-queue")

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

(in-package :tournament)

现在,再次,在SLIME中,这很好。但是,在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)

1 个答案:

答案 0 :(得分:3)

由于编译和加载的时间不同,这种情况正在发生。

编译时,不评估普通函数调用(如ql:quickload)。当编译器尝试处理defpackage形式(不是普通函数调用,但是在编译时具有副作用的宏)时,加载&#34的函数;优先级队列"没有被调用,包裹不可用。

如果您加载文件而不是编译和加载,则不会看到这一点,因为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 /(以及tournament.lisp)中,并在repl中使用(ql:quickload "tournament")开始并加载它。

我经常使用后一种设置,因此我编写了一个Lisp程序来为我做quickproject