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

时间:2015-10-07 23:13:54

标签: common-lisp sbcl slime quicklisp asdf

我正在努力让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
  • 重新启动所有内容

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

我错过了让这些作品正常合作的内容?

3 个答案:

答案 0 :(得分:5)

如果您编译包含声明的文件

(ql:quickload "cl-csv")

然后此调用将编译,但不会执行。这就是编译器通常做的事情:它编译但不执行。因此,如果您稍后在同一文件中使用一些Lisp (命名空间) - 将在系统cl-csv中引入的包 - 那么它可能不存在,如果您还没有通过加载系统来加载它。

有两种典型的解决方案:

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

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

答案 1 :(得分:4)

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

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

  • 创建并输入目录“my-system”
  • 创建和编辑“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),这将加载所有已声明的依赖项。

答案 2 :(得分:0)

在 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 中的副本是没有用的,你可以删除它。