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安装某些东西时,下一个会话没有“记住”它?难道我做错了什么?
这是配置问题还是对它应该如何工作的普遍误解?
然后,我运行(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环境,其中包含在保存映像之前加载的系统。
归档时间: |
|
查看次数: |
346 次 |
最近记录: |