如何让Emacs/Slime/SBCL识别quicklisp包

Ana*_*Ana 2 sbcl common-lisp asdf slime quicklisp

我想让Emacs,SLIME和quicklisp正常合作.我有以下环境设置:

  • 安装了Emacs
  • 在Emacs中安装了SLIME
  • 已安装SBCL
  • 安装quicklisp
  • (quicklisp-quickstart:install)在SBCL中运行
  • (ql:add-to-init-file)在SBCL中运行
  • (ql:quickload "quicklisp-slime-helper")在SBCL中运行
  • (ql:quickload "cl-csv")在SBCL中使用安装的包cl-csv
  • 添加(setq inferior-lisp-program "sbcl")到.emacs
  • 添加(load (expand-file-name "~/quicklisp/slime-helper.el"))到.emacs
  • 重启了一切

我有一个test.lisp文件,首先(ql:quickload "cl-csv")加载包并使用它.当我将文件加载到Emacs并运行SLIME,然后尝试使用它编译它slime-compile-and-load-file,我得到SBCL中的错误Package CL-CSV does not exist.

我错过了什么让这些作品正确地协同工作?

Rai*_*wig 5

如果编译包含语句的文件

(ql:quickload "cl-csv")
Run Code Online (Sandbox Code Playgroud)

那么这个调用将被编译,但不会被执行.这就是编译器通常所做的:它编译,但不执行.因此,如果你使用一些Lisp的(命名空间)后来在同一个文件-这将在系统中引入了一个包cl-csv-那么它可能不存在,如果你以前没有装好了,通过加载系统.

有两种典型的解决方案:

  • 将loading命令放在一个编译(可选)和/或之前加载的文件中
  • 使用EVAL-WHEN:compile-toplevel,:load-toplevel:execute

请注意,这cl-csv是一个组织源文件系统.一是Lisp的命名空间组织Lisp的符号.包和系统可以具有相同的名称,但它们实际上是两个不同的东西.


cor*_*ump 5

ql:quickload直接调用有利于测试和与开发环境交互。如果您经常使用某些系统,则可以将它们快速加载到初始化文件中(在您的情况下为~/.sbclrc)。

但是,您在编程时的目的通常是开发一个新系统(一个库或一个应用程序,但就 Common Lisp 而言,这是一个“系统”)。您通常不需要(ql:quickload ...)在源代码中进行显式调用。相反,您定义了一个系统,您可以在其中声明依赖项,并且您的代码假定加载了适当的依赖项。

如果你链接里面的目录,Quicklisp 可以找到你的系统~/quicklisp/local-projects/。因此,下次您重新启动 Lisp 并希望在 上进行开发时my-system,您可以执行(ql:quickload :my-system)它将加载所有声明的依赖项。