我使用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)
答案 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。