每次重新启动时都必须重新安装Quicklisp软件包

Mad*_*ist 2 sbcl common-lisp quicklisp

我正在编写一个(SBCL)Common Lisp程序,该程序在文件顶部具有以下行:

(defpackage :my-package
  (:use :cl :cl-who :hunchentoot :parenscript))
Run Code Online (Sandbox Code Playgroud)

我在MacOS上运行Emacs 25,SBCL和SLIME。

每当我评估上面的行时,总会首先收到此错误:

名称“ CL-WHO”不指定任何软件包。[SB-KERNEL类型的条件:SIMPLE-PACKAGE-ERROR]

然后,我运行(ql:quickload "cl-who")并观看CL-WHO软件包的安装。对于其他两个包,我重复一遍。一旦完成此操作,就可以成功评估表单。

问题是,每次我重新启动Emacs(或Lisp进程,在这种情况下我都认为大致相同)时,都需要这样做。为什么当我使用Quicklisp安装某些东西时,下一个会话没有“记住”它?难道我做错了什么?

这是配置问题还是对它应该如何工作的普遍误解?

cor*_*ump 6

然后,我运行(ql:quickload“ cl-who”)并观察CL-WHO软件包的安装。对于其他两个包,我重复一遍。一旦完成此操作,就可以成功评估表单。

您可以一次快速加载多个系统:

(ql:quickload '(:cl-who :hunchentoot :parenscript))
Run Code Online (Sandbox Code Playgroud)

[...]每次我重新启动Emacs(或Lisp进程,在这种情况下,我假设它大致相同)。

就是这种情况,但是请注意,您可以从外壳启动Lisp进程并从Emacs连接到它。在这种情况下,您可以退出并重新启动Emacs,而无需终止Lisp进程。从外壳启动新的REPL并创建服务器:

(ql:quickload :swank)
(swank:create-server :port 5000)
Run Code Online (Sandbox Code Playgroud)

然后,slime-connect从Emacs 调用(localhost主机和端口参数使用和分别为5000和)。这也可以用来监视正在运行的应用程序。

为什么当我使用Quicklisp安装某些东西时,下一个会话没有“记住”它?

该系统已获取,编译并安装在您的计算机上,这说明了为什么第二次快速加载项目会更快。但是,只有在您请求时才使用Quicklisp或ASDF将系统加载到您的环境中。

定义系统

参见§6。使用defsystem定义系统,以介绍如何定义系统。假设您为系统命名stackoverflow。最简单的入门方法是创建以下文件:

~/quicklisp/local-projects/stackoverflow/stackoverflow.asd
Run Code Online (Sandbox Code Playgroud)

其中包含:

(defsystem "stackoverflow"
  :depends-on ("cl-who" "hunchentoot" "parenscript"))
Run Code Online (Sandbox Code Playgroud)

当您执行时(ql:quickload "stackoverflow"),Quicklisp将加载其所有依赖项。

无需加载所有必需的系统,只需加载一个即可。

自动加载该系统...

Lisp实现可以在启动时执行代码。一个可能的方法是从一个配置文件执行代码:[.]ccl-init.lisp.eclrc.lispworks.sbclrc(你的情况)等执行quickload只有Quicklisp本身可用:

#+quicklisp
(ql:quickload "stackoverflow")   
Run Code Online (Sandbox Code Playgroud)

...或在预装所有系统的情况下转储映像

您还可以加载所有必需的系统,并转储可执行映像。从终端(不是从Slime)启动一个新的SBCL,调用(ql:quickload "stackoverflow"),然后:

(sb-ext:save-lisp-and-die "my-env" 
                          :executable t
                          :compression 9)
Run Code Online (Sandbox Code Playgroud)

(压缩是可选的)

然后,应在同一目录中创建一个名为“ my-env”的可执行文件。每次启动时,您都有一个全新的Lisp环境,其中包含在保存映像之前加载的系统。