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

时间:2018-01-08 02:17:41

标签: common-lisp sbcl quicklisp

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

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

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

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

  

名称" CL-WHO"不指定任何包装。      [SB-KERNEL类型:简单包装 - 错误]

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

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

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

1 个答案:

答案 0 :(得分:5)

  

然后,我运行(ql:quickload“cl-who”)并观看CL-WHO软件包安装。我重复其他两个包。完成后,可以成功评估表单。

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

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

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

这就是这种情况,但请注意,您可以从shell启动Lisp进程并从Emacs连接到它。在这种情况下,您可以在不杀死Lisp进程的情况下退出并重新启动Emacs。 从shell启动一个新的REPL并创建一个服务器:

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

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

  

为什么当我使用Quicklisp安装某些内容时,它不会被“记住”下一个会话?

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

定义系统

有关如何定义系统的介绍,请参阅§6. Defining systems with 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(您的情况)等。执行{{1}只有当Quicklisp本身可用时才会出现:

quickload

...或转储预装了所有系统的图像

您还可以加载所有必需的系统,并转储可执行映像。 从终端(而不是史莱姆)开始新的SBCL,拨打#+quicklisp (ql:quickload "stackoverflow") ,然后:

(ql:quickload "stackoverflow")

(压缩是可选的)

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