1,多个源文件如何组织,编译和依赖。
2,如何引入其他的Lisp软件包。
这就不得不引入ASDF和Quicklisp两个工具了。
项目构建工具-ASDF
ASDF是Another System Definition Facility的缩写。这个名字够个性(程序员都知道为什么)。ASDF用来描述Lisp源文件之间的相互依赖关系,进而保证程序的各个部分能够按照正确的顺序进行编译、加载、测试等等。可以近似地把ASDF看作编写C语言程序时所用到的GNU Make工具和Java的Ant工具。ASDF最新已经发布了ASDF 2,ASDF 2指的是2.000及以后的发布版本;1.656到1.728之间的发布版本是ASDF 2的开发版;ASDF 1指的是1.369之前的版本。
许多Lisp实现都包含了ASDF,可以使用Common Lisp的require函数加载ASDF模块:(require :asdf)或(require 'asdf)(我所使用的SBCL 1.0.40和Clisp 2.48在启动的时候都会自动加载ASDF模块,因此无需手工加载)。可以使用(asdf:asdf-version)函数查看ASDF是否加载成功,如果此函数引发一个异常,那么要么ASDF没有加载成功,要么正在使用的是ASDF 1的较旧的版本。如果Lisp实现中没有包含ASDF,可以使用(load "/path/to/asdf.lisp")手动加载ASDF。
具体的使用方法 参考2 有介绍。不多说了。
另一个工具是MK-DEFSYSTEM(http://www.cliki.net/mk-defsystem),不过使用没有asdf流行。 有些Common Lisp实现也有它们自己的系统构建支持。
Lisp依赖包管理工具-Quicklisp
Quicklisp是Common Lisp的库管理工具。按照其官方介绍:Quicklisp支持数十种主流的CL实现,并且提供超过700个包(库)的下载,安装,管理和加载。个人认为Quickliap类似于ubuntu的apt工具或者java的maven工具。实现(库)包的依赖管理。
安装quicklisp
开启一个lisp shell,并包含此文件。
$ sbcl --load quicklisp.lisp
然后安装quicklisp
* (quicklisp-quickstart:install)
然后你需要在每次启动sbcl或者clisp的时候自动加载quicklisp
* (ql:add-to-init-file)
搜索软件包,类似于apt-cache search。例如搜索带有vector的lisp库,注意字符串两旁的双引号。
* (ql:system-apropos "vector")
安装软件包
* (ql:quickload "lib-name")
升级所有安装了的lisp库
* (ql:update-all-dists)
升级quicklisp本身
* (ql:update-client)
quicklisp系统概览
安装之后,quicklisp会在系统的home目录下新建一个quicklisp目录,所有的文件和库都放在这个地方。
存在的问题:
(ql:system-apropos "socket")
The interpreter showed an error which was,
No address associated with hostname (error #-5) during socket creation or nameserver operation in gethostbyname
[Condition of type CCL:SOCKET-CREATION-ERROR]
这个问题浪费了我半天的时间,最后才发现beta.quicklisp.org无法访问的原因,试用了代理直接访问,发现网站是没有问题了。不用说,肯定是伟大的GFW在作怪吧。
quicklisp和asdf的关系
How is Quicklisp related to ASDF?
Quicklisp has an archive of project files and metadata about project relationships. It can download a project and its dependencies. ASDF is used to actually compile and load the project and its dependencies.
ASDF is a little like make and Quicklisp is a little like a Linux package manager.
quicklisp使用了asdf处理库文件之间的依赖关系。但是用户并不需要直接使用asdf本身,因为quicklisp类似于ubuntu的apt,而asdf类似于makefile。Quicklisp记录工程文件存档和工程之间的关系。Asdf编译工程和加载工程的依赖。
总结
关于asdf使用的具体介绍就等下篇文章了。
参考:
[1] 用 sbcl, asdf 和 cl-launch 编写可分发的 lisp 程序 -冰河伞哥 http://tianchunbinghe.blog.163.com/blog/static/7001200692314249376/
[2] ASDF Manual ---http://common-lisp.net/project/asdf/asdf.html#Loading-ASDF
[3] http://basiccoder.com/constructing-common-lisp-package-by-asdf.html
【4】Quicklisp web sites http://www.quicklisp.org/beta/index.html
【5】http://www.cnblogs.com/unionx/articles/quicklisp-intro.html
【6】https://news.ycombinator.com/item?id=3809098