2

我使用 Emacs 作为我的 Common Lisp(确切地说是 SBCL)编辑器,带有 SLIME。我按照这里的说明设置了 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 安装了 slime package-install,我的 .emacs 文件中有以下代码来设置它:

(setq inferior-lisp-program "/usr/local/bin/sbcl")
(require 'slime)
(slime-setup)
4

1 回答 1

4

这是因为编译和加载的时间不同。

ql:quickload编译时,不评估普通函数调用(如)。当编译器试图处理defpackage表单时(这不是一个普通的函数调用,而是一个在编译时有副作用的宏),加载“priority-queue”的函数没有被调用,包不可用.

如果您加载文件而不是编译和加载,您将不会看到这一点,因为 load 在加载时评估每个表单。

有几个选项可用。最简单的方法是将您的调用包装在ql:quickloadin 中eval-when,例如

(eval-when (:compile-toplevel :load-toplevel :execute)
  (ql:quickload "priority-queue"))

我更喜欢为我的项目定义一个系统,不管它多么小,所以我会创建一个如下所示的锦标赛.asd 文件:

(asdf:defsystem #:tournament
  :depends-on (#:priority-queue)
  :serial t
  :components ((:file "tournament.lisp")))

我会把它放在 ~/quicklisp/local-projects/tournament/ (连同锦标赛.lisp)并(ql:quickload "tournament")在 repl 中使用以开始并加载它。

我经常使用后一种设置,所以我编写了一个名为quickproject的 Lisp 程序来为我做这件事。

于 2014-05-15T14:21:17.380 回答