我正在编写一个(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安装东西时,它不会被记住"为下一届会议?难道我做错了什么?
这是配置问题还是对它应该如何工作的一般误解?
答案 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环境,其中包含您在保存图像之前加载的系统。