首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >黏液和Quicklisp对彼此不友好

黏液和Quicklisp对彼此不友好
EN

Stack Overflow用户
提问于 2014-05-15 10:48:17
回答 1查看 446关注 0票数 2

我使用Emacs作为我的Common (确切地说,是SBCL)编辑器,带有黏液。我按照这里的指令设置了Quicklisp,并检查它是否在黏液之外工作,一切都很好--我可以抓取和下载代码,包括它,所有的东西。

现在,我试图在Emacs中使用编译/加载File命令作为一个源文件,其顶部有以下内容:

代码语言:javascript
复制
(ql:quickload "priority-queue")

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

(in-package :tournament)

现在,再一次,不是在黏液中,这件事很好。然而,在黏液中,我得到以下形式的错误:

代码语言:javascript
复制
The name "PRIORITY-QUEUE" does not designate any package.
  [Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR]

当然还有回溯。我是不是错过了什么特别的东西?我使用来自Emacs的package-install安装了slime,我的.emacs文件中有以下代码来设置它:

代码语言:javascript
复制
(setq inferior-lisp-program "/usr/local/bin/sbcl")
(require 'slime)
(slime-setup)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-15 14:21:17

这是由于编译和加载的不同时间而发生的。

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

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

有几种选择可供选择。最简单的方法是将对ql:quickload的调用封装在eval-when中。

代码语言:javascript
复制
(eval-when (:compile-toplevel :load-toplevel :execute)
  (ql:quickload "priority-queue"))

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

代码语言:javascript
复制
(asdf:defsystem #:tournament
  :depends-on (#:priority-queue)
  :serial t
  :components ((:file "tournament.lisp")))

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

我经常使用后一种设置,以至于我编写了一个名为速成工程的Lisp程序。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23676072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档