Ana*_*Ana 2 sbcl common-lisp asdf slime quicklisp
我想让Emacs,SLIME和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.
我错过了什么让这些作品正确地协同工作?
如果编译包含语句的文件
(ql:quickload "cl-csv")
Run Code Online (Sandbox Code Playgroud)
那么这个调用将被编译,但不会被执行.这就是编译器通常所做的:它编译,但不执行.因此,如果你使用一些Lisp的包(命名空间)后来在同一个文件-这将在系统中引入了一个包cl-csv-那么它可能不存在,如果你以前没有装好了,通过加载系统.
有两种典型的解决方案:
EVAL-WHEN带:compile-toplevel,:load-toplevel和:execute请注意,这cl-csv是一个组织源文件的系统.一包是Lisp的命名空间组织Lisp的符号.包和系统可以具有相同的名称,但它们实际上是两个不同的东西.
ql:quickload直接调用有利于测试和与开发环境交互。如果您经常使用某些系统,则可以将它们快速加载到初始化文件中(在您的情况下为~/.sbclrc)。
但是,您在编程时的目的通常是开发一个新系统(一个库或一个应用程序,但就 Common Lisp 而言,这是一个“系统”)。您通常不需要(ql:quickload ...)在源代码中进行显式调用。相反,您定义了一个系统,您可以在其中声明依赖项,并且您的代码假定加载了适当的依赖项。
创建和编辑“my-system.asd”
(in-package :asdf-user)
(defsystem :my-system
:depends-on (:cl-csv))
Run Code Online (Sandbox Code Playgroud)如果你链接里面的目录,Quicklisp 可以找到你的系统~/quicklisp/local-projects/。因此,下次您重新启动 Lisp 并希望在 上进行开发时my-system,您可以执行(ql:quickload :my-system)它将加载所有声明的依赖项。