在common lisp规范中并没有规定程序的分发方式,如何分发程序很大程度取决于你使用的cl平台及操作系统。
你可以直接将源代码发给你的团队成员,对于包含大量源文件的软件包,你也可以使用asdf工具以及在其基础上演变出来的asdf-install工具,她类似于java平台的maven,是一个非常强大而且使用方便的工具。如果你做的是开源项目的或只是在开发团队内分发软件,使用asdf-install似乎是很好的选择。
但对于商业项目,这样的分发模式恐怕就很难让人接受了。幸运的是现在流行的大部分common lisp实现都支持“store image”操作,这使得你可以将你的软件发布为一个可加载的二进制包甚至一个可以独立运行的应用程序。在本文中,我将主要介绍sbcl中的“sb-ext:save-lisp-and-die”函数 .
正如上面所讲,“sb-ext:save-lisp-and-die” ,用于将当前环境存储到一个镜像文件中,你可以根据需要将其存储为一个可加载包(不包含sbcl运行时)或一个可独立运行的执行文件(包含sbcl运行时)。
首先你应当将需要发布的lisp文件加载到运行环境中,进入sbcl,根据代发布软件包的情况,选择asdf,require,或load等方法将其加载到运行时环境中。
然后你就可以使用“sb-ext:save-lisp-and-die” 发布二进制包了。“sb-ext:save-lisp-and-die” 的定义是:
(save-lisp-and-die (corefilename &key (:toplevel
:executable
:save-runtime-options
:purify
:root-structures
:environment-name
) ....)
你可以在sbcl中输入(sb-ext:save-lisp-and-die "文件名(如果不提供完整路径默认为当前目录)")将运行时保存到一个可加载的二进制文件中。
或者(sb-ext:save-lisp-and-die "文件名(如果不提供完整路径默认为当前目录)" :executable t
)将运行时保存到一个stand-alone的可执行文件中,该操作与上面不同的地方是,它将把sbcl运行时环境一并存储到目标文件中,这样即使在没有安装sbcl的环境中该程序也可以运行。
但是仅仅这样,程序也不能正常运行,应为,系统并不知道程序的入口,所以你需要使用:toplevel指明,就像下面这样:
(sb-ext:save-lisp-and-die "文件名(如果不提供完整路径默认为当前目录)" :executable t
:toplevel 在这里输入需要调用的函数
,当然也可以定义一个lambda函数)。
:save-runtime-options 用于指明存储当前程序状态,包括全局变量的值等,默认为nil。
:purify
:root-structures
:environment-name这几个参数主要用于优化垃圾回收,详情清参见sbcl手册:http://www.sbcl.org/manual/Saving-a-Core-Image.html