如何让 Emacs/Slime/SBCL 识别 quicklisp 包
Posted
技术标签:
【中文标题】如何让 Emacs/Slime/SBCL 识别 quicklisp 包【英文标题】:How to get Emacs/Slime/SBCL to recognize quicklisp packages 【发布时间】:2016-01-05 09:06:12 【问题描述】:我正在尝试让 Emacs、SLIME 和 quicklisp 一起正常工作。我设置了以下环境:
已安装 Emacs 在 Emacs 中安装了 SLIME 已安装 SBCL 已安装 quicklisp 在 SBCL 中运行(quicklisp-quickstart:install)
在 SBCL 中运行 (ql:add-to-init-file)
在 SBCL 中运行 (ql:quickload "quicklisp-slime-helper")
在 SBCL 中使用 (ql:quickload "cl-csv")
安装包 cl-csv
将 (setq inferior-lisp-program "sbcl")
添加到 .emacs
将 (load (expand-file-name "~/quicklisp/slime-helper.el"))
添加到 .emacs
重新启动一切
我有一个以(ql:quickload "cl-csv")
开头的test.lisp
文件来加载包并使用它。当我将文件加载到 Emacs 并运行 SLIME,然后尝试使用 slime-compile-and-load-file
编译它时,我在 SBCL 中收到错误 Package CL-CSV does not exist
。
为了让这些部分正常工作,我错过了什么?
【问题讨论】:
你能提供你的源文件吗? (或至少有quickload
和引用cl-csv
的部分)
您不能真正将 Common Lisp 文件“加载”到 Emacs 中。但你可以编辑它。
【参考方案1】:
在 Emacs 的 SLIME REPL 中重新安装 quicklisp。
问题在于 Emacs Slime (REPL) 既不知道是否安装了 quicklisp 也不知道它的安装位置。要解决此问题,您所要做的就是在 Emacs 的 slime repl 上重新安装 quicklisp。 (“quicklisp.lisp”文件应该在 SLIME REPL 的当前工作文件夹中。)
M-x slime
CL-USER> (load "quicklisp.lisp")
CL-USER> (quicklisp-quickstart:install)
CL-USER> (ql:add-to-init-file)
CL-USER> (ql:quickload "quicklisp-slime-helper")
例如)我的“~/.emacs”文件:
(use-package slime
:ensure t
:defer t
:init
(setq inferior-lisp-program "clisp")
:config
(slime-setup '(slime-fancy slime-company))
:hook
(slime-mode . slime-company)
(slime-mode . (lambda ()
(load (expand-file-name "D:/util/emacs27/quicklisp/slime-helper.el"))
(add-to-list 'slime-contribs 'slime-fancy)
(add-to-list 'slime-contribs 'inferior-slime))))
(use-package slime-company
:after slime
:bind-keymap
("C-n" . company-select-next)
("C-p" . company-select-previous)
("C-d" . company-show-doc-buffer)
("M-." . company-show-location)
:config (setq slime-company-completion 'fuzzy
slime-company-after-completion 'slime-company-just-one-space))
然后,quicklisp 将被重新安装到 Emacs 的 HOME 目录(“~/”)中。现在,您已经在 (a) Windows 10 的 HOME 和 (a) Emacs 的 HOME 中安装了相同的 quicklisp。如果你只在 Emacs 的 Slime REPL 上使用 quicklisp,那么 Windows 10 的 HOME 中的副本是没有用的,你可以删除它。
【讨论】:
【参考方案2】:直接调用ql:quickload
有利于测试以及与您的开发环境进行交互。如果您经常使用某些系统,您可以在初始化文件中快速加载它们(在您的情况下为~/.sbclrc
)。
但是,您在编程时的目的通常是开发一个新系统(库或应用程序,但就 Common Lisp 而言,这是一个“系统”)。您通常不需要在源代码中进行显式的 (ql:quickload ...)
调用。相反,您定义了一个系统,您可以在其中声明依赖项,并且您的代码假定加载了适当的依赖项。
创建和编辑“my-system.asd”
(in-package :asdf-user)
(defsystem :my-system
:depends-on (:cl-csv))
如果您链接~/quicklisp/local-projects/
中的目录,Quicklisp 可以找到您的系统。
所以下次你重启你的 Lisp 并想在 my-system
上开发时,你可以执行 (ql:quickload :my-system)
来加载所有声明的依赖项。
【讨论】:
【参考方案3】:如果你编译一个包含语句的文件
(ql:quickload "cl-csv")
那么这个调用将被编译,而不是执行。这就是编译器通常做的事情:它编译,但不执行。因此,如果您稍后在同一个文件中使用一些 Lisp package(命名空间) - 一个将在系统中引入的包 cl-csv
- 那么它可能不存在,如果你没有加载它之前,通过加载系统。
对此有两种典型的解决方案:
将加载命令放在一个文件中,该文件之前编译(可选)和/或加载 将EVAL-WHEN
与:compile-toplevel
、:load-toplevel
和:execute
一起使用
注意cl-csv
是一个系统,组织源文件。 package 是一个 Lisp namespace,用于组织 Lisp symbols。包和系统可以有相同的名称,但它们实际上是两个不同的东西。
【讨论】:
以上是关于如何让 Emacs/Slime/SBCL 识别 quicklisp 包的主要内容,如果未能解决你的问题,请参考以下文章