Emacs SLIME和Quicklisp玩得不好
我使用Emacs作为我的公共Lisp(确切地说是SBCL)编辑器,使用SLIME。我按照说明设置了Quicklisp,并检查它是否在SLIME之外工作,一切都很好——我可以抓取和下载代码,包括它,一切 现在,我尝试在Emacs中对源文件使用Compile/Load File命令,顶部有以下内容: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 :
(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程序来为我完成它,名为