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

Common lisp 如何让Emacs/Slime/SBCL识别quicklisp包,common-lisp,sbcl,slime,quicklisp,asdf,Common Lisp,Sbcl,Slime,Quicklisp,Asdf,我正在努力让Emacs、SLIME和quicklisp正常工作。我已设置以下环境: 已安装的Emacs 在Emacs中安装粘液 已安装SBCL 已安装quicklisp 在SBCL中运行(quicklisp快速启动:安装) 在SBCL中运行(ql:add to init file) 在SBCL中运行(ql:quickload“quicklisp slime helper”) 使用SBCL中的(ql:quickload“cl-csv”)安装包cl-csv 在.emacs中添加了(setq低级li

我正在努力让Emacs、SLIME和quicklisp正常工作。我已设置以下环境:

  • 已安装的Emacs
  • 在Emacs中安装粘液
  • 已安装SBCL
  • 已安装quicklisp
  • 在SBCL中运行
    (quicklisp快速启动:安装)
  • 在SBCL中运行
    (ql:add to init file)
  • 在SBCL中运行
    (ql:quickload“quicklisp slime helper”)
  • 使用SBCL中的
    (ql:quickload“cl-csv”)
    安装包cl-csv
  • 在.emacs中添加了
    (setq低级lisp程序“sbcl”)
  • (加载(扩展文件名“~/quicklisp/slime helper.el”)
    添加到.emacs
  • 重启一切
我有一个
test.lisp
文件,该文件以
(ql:quickload“cl csv”)
开头,用于加载包并使用它。当我将文件加载到Emacs并运行SLIME,然后尝试使用
SLIME compile and load file
对其进行编译时,我在SBCL中得到一个错误,即
包CL-CSV不存在


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

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

(ql:quickload "cl-csv")
然后将编译此调用,但不会执行。编译器通常就是这样做的:它编译,但不执行。因此,如果您稍后在同一文件中使用某个Lisp包(名称空间)——该包将引入系统
cl csv
——那么,如果您之前没有加载该包,则通过加载系统,该包可能不存在

有两种典型的解决方案:

  • 将加载命令放在编译(可选)和/或加载之前的文件中
  • :编译顶层
    :加载顶层
    :执行

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

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

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

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

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

在Emacs的SLIME REPL上重新安装quicklisp。

问题是Emacs Slime(REPL)既不知道quicklisp是否安装,也不知道它安装在哪里。要解决此问题,只需在Emacs的slime repl上重新安装quicklisp即可。(“quicklisp.lisp”文件应位于SLIME REPL的当前工作文件夹中。)

e、 g.)我的“~/.emacs”文件:


然后,quicklisp将重新安装到Emacs的主目录(“~/”)中。现在,您已经在(a)Windows 10的主页和(a)Emacs的主页中安装了相同的quicklisp。如果您仅在Emacs的Slime REPL中使用quicklisp,则Windows 10主页中的副本将无效,您可以将其删除。

能否提供源文件?(或者至少是带有
quickload
并引用
cl-csv
的部分)您无法将公共Lisp文件真正“加载”到Emacs中。但是你可以编辑它。
(in-package :asdf-user)
(defsystem :my-system
   :depends-on (:cl-csv))
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")    
(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))