5

我正在尝试让 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使用Package CL-CSV does not exist.

为了让这些部分正常工作,我错过了什么?

4

3 回答 3

7

如果你编译一个包含语句的文件

(ql:quickload "cl-csv")

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

有两种典型的解决方案:

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

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

于 2015-10-08T06:53:01.820 回答
5

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

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

  • 创建并进入目录“我的系统”
  • 创建和编辑“my-system.asd”

    (in-package :asdf-user)
    (defsystem :my-system
       :depends-on (:cl-csv))
    

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

于 2015-10-08T09:14:22.187 回答
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 中的副本是没有用的,你可以删除它。

于 2021-01-04T09:44:32.613 回答