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

Common lisp 每次重新启动时都必须重新安装Quicklisp软件包,common-lisp,sbcl,quicklisp,Common Lisp,Sbcl,Quicklisp,我正在编写一个(SBCL)通用Lisp程序,该程序在文件顶部有以下行: (defpackage :my-package (:use :cl :cl-who :hunchentoot :parenscript)) 我在MacOS上运行Emacs 25、SBCL和SLIME 每当我评估上面的行时,我总是首先得到这个错误: “CL-WHO”名称不表示任何包装。 [SB-KERNEL类型的条件:SIMPLE-PACKAGE-ERROR] 然后,我运行(ql:quickload“cl-who”)并观

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

(defpackage :my-package
  (:use :cl :cl-who :hunchentoot :parenscript))
我在MacOS上运行Emacs 25、SBCL和SLIME

每当我评估上面的行时,我总是首先得到这个错误:

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

然后,我运行
(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进程。 从shell启动新的REPL并创建服务器:

(ql:quickload :swank)
(swank:create-server :port 5000)
然后,从Emacs调用
slime connect
(使用
localhost
和5000获取主机和端口参数)。也可用于监视正在运行的应用程序

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

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

定义一个系统 有关如何定义系统的介绍,请参见。假设您将系统命名为
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本身可用时才执行
快速加载

#+quicklisp
(ql:quickload "stackoverflow")   
... 或者在所有系统都已预加载的情况下转储映像 您还可以加载所有必需的系统,并转储可执行映像。 从终端(而不是Slime)启动新的SBCL,调用
(ql:quickload“stackoverflow”)
,然后:

(sb-ext:save-lisp-and-die "my-env" 
                          :executable t
                          :compression 9)
(压缩是可选的)


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

Quicklisp处理的是系统(用
ASDF:DEFSYSTEM
定义),而不是包(由
CL:defspackage
定义)。系统可以定义零个或多个软件包,这些软件包只有在加载系统后才可用(可以直接使用ASDF,也可以使用
QL:QUICKLOAD
;如果系统不可用,后者也会下载系统)。您以前安装的系统不会自动加载,因为您不希望所有的图像都被数百个您实际上不使用的库弄乱。要轻松加载项目及其依赖项,请为其定义ASDF系统。可能有帮助:。一旦有了.asd和
(asdf:defsystem
,C-C C-k it,现在您可以
ql:quickload
它。依赖项在.asd中,
:取决于
列表。Quicklisp在
~/Quicklisp/dists/Quicklisp/software/
中安装库。谢谢你们两位!太棒了!如果我选择使用图像转储,我可以每次都从该图像开始,然后再从它开始吗一旦项目进展,就用另一个名字吗?@MadPhysicast Yes