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



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

(defpackage :my-package
(:use :cl :cl-who :hunchentoot :parenscript))

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

每当我评估上面的行时,我总是一开始收到此错误:

"CL-WHO"这个名称并不表示任何一揽子计划。 [SB 内核类型的条件:简单包错误]

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

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

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

然后

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

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

(ql:quickload '(:cl-who :hunchentoot :parenscript))

每次我重新启动Emacs(或Lisp进程,我认为在这种情况下大致等效)时。

这里就是这种情况,但请注意,你可以从 shell 启动一个 Lisp 进程,然后从 Emacs 连接到它。在这种情况下,你可以退出并重新启动 Emacs,而不会终止 Lisp 进程。 从命令行管理程序启动一个新的 REPL 并创建一个服务器:

(ql:quickload :swank)
(swank:create-server :port 5000)

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

为什么当我使用 Quicklisp 安装某些东西时,它不会在下一个会话中"记住"?

系统被获取、编译并安装在您的机器上,这就解释了为什么第二次快速加载项目时,它更快。但是,系统仅在您请求时加载到您的环境中,无论是使用 Quicklisp 还是 ASDF。

定义系统

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

~/quicklisp/local-projects/stackoverflow/stackoverflow.asd

其中包含:

(defsystem "stackoverflow"
:depends-on ("cl-who" "hunchentoot" "parenscript"))

当你执行(ql:quickload "stackoverflow")时,Quicklisp将加载它所有的依赖关系。

您不需要加载所有必需的系统,而只需要加载一个系统。

要么自动加载此系统...

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

#+quicklisp
(ql:quickload "stackoverflow")   

。或在预加载所有系统的情况下转储映像

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

(sb-ext:save-lisp-and-die "my-env" 
:executable t
:compression 9)

(压缩是可选的)

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

最新更新