Common Lisp开发环境

Table of Contents

1 Common Lisp实现

活跃中的开源实现代表有:

主流的商业实现有LispWorks、Scieneer CL和Allegro CL,它们的价格都不便宜。

推荐SBCL和CCL。

2 Emacs+Slime+SBCL环境安装

Lisp和其他很多语言的开发模式不同,Lisp开发模式是在REPL下交互式模式下进行,REPL即read、eval、print和loop——即Lisp读入用户输入的表达式并执行,然后将执行结果反馈给用户,接着继续等待用户输入。这种模式有点类似于在IPython下写Python代码,所以开发效率是非常高的。

但多数Common Lisp实现默认的REPL都很弱,在真实开发过程中我们还需要补全等等功能,Slime就是一种工作在Emacs下、强化了REPL的Lisp mode,Emacs+Slime是一种非常流行的Common Lisp开发环境。

2.0.1 安装Emacs

目前Emacs最新版本是24,Emacs24还集成了包管理功能,非常便于我们安装插件,所以推荐使用Emacs24。本节以Ubuntu为例。

新版本的Ubuntu源中已有Emacs24,Emacs分了带图形界面和不带图形界面(nox),推荐使用不带图形界面版的,不带图形界面版的工作在终端下,直接通过apt-get安装:

$ sudo apt-get install emacs24-nox

如果安装了带图形化界面的Emacs,带上-nw参数即可打开不带图形化界面的版本:

$ emacs -nw

2.0.2 安装SBCL

市面上有很多Common Lisp的实现,包括数个商业版的实现,大家可以根据自己的喜好选择,本文我推荐使用SBCl这个Common Lisp实现,目前SBCL开发比较活跃,在Linux上性能表现也不错。

部分Linux发行版里可以直接通过软件源来安装,比如Ubuntu下可以直接通过源安装:

$ sudo apt-get install sbcl

但推荐直接从官方下载二进制包安装,可以获得最新的SBCL。首先在SBCL官方下载页面下载SBCL的二进制包:http://www.sbcl.org/platform-table.html

然后解压:

$ tar xvf sbcl-1.2.1-x86-64-linux-binary.tar.bz2

进入SBCL文件目录,并安装:

$ cd sbcl-1.2.1-x86-64-linux $ sudo INSTALLROOT=/usr/local sh install.sh

最后执行sbcl命令,检查是否安装成功,如果安装成功,执行后将进入交互式模式:

This is SBCL 1.2.1, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
*

2.0.3 安装Slime

Slime项目的主页是:http://common-lisp.net/project/slime/ ,Github仓库地址是:https://github.com/slime/slime

建议从Github仓库clone最新的Slime。

指定一个目录,并clone最新的Slime(我这里选用/opt):

$ cd /opt $ sudo git clone https://github.com/slime/slime.git

2.0.4 在Emacs中加载Slime

编辑Home目录下的.emacs文件(如果没有请自行创建),添加如下代码:

;; 设置Slime的路径,我这里是/opt/slime
(add-to-list 'load-path "/opt/slime")
(require 'slime-autoloads)

;; 设置具体的Common Lisp实现,我这里是sbcl
(setq inferior-lisp-program "sbcl")
;; Slime把多数功能拆成独立的包(Contrib Packages)
;; 需要根据功能单独加载,其中slime-fancy会自动加载流行的包,一般情况下只加载slime-fancy即可
(setq slime-contribs '(slime-fancy))

接着运行Emacs,然后按下M(Alt)+x,输入slime并回车,如果能成功加载Slime,说明安装没问题。加载成功后即可进入REPL:

CL-USER>

此时可以输入S表达式。Slime可以帮助补全内置的符号名,比如输入defu,然后按下C(Ctrl)-M-i即可补全成defun。

2.0.5 安装Paredit插件

Paredit可以助你在写S表达式时更高效,比如打了“(”,Paredit会自动帮你补全“)”等等。可通过ELPA来自动安装Paredit,如果您还不会使用ELPA,请见[这里](/emacs/使用ELPA管理Emacs扩展包)

安装之后,编辑~/.emacs,添加如下代码:

(autoload 'enable-paredit-mode "paredit" "Turn on pseudo-structural editing of Lisp code." t)
(add-hook 'emacs-lisp-mode-hook       #'enable-paredit-mode)
(add-hook 'eval-expression-minibuffer-setup-hook #'enable-paredit-mode)
(add-hook 'ielm-mode-hook             #'enable-paredit-mode)
(add-hook 'lisp-mode-hook             #'enable-paredit-mode)
(add-hook 'lisp-interaction-mode-hook #'enable-paredit-mode)
(add-hook 'scheme-mode-hook           #'enable-paredit-mode)

然后重启Emacs,打开一个文件,如/tmp/x.lisp,接着随便编写一些Lisp代码感受一下。

关于Paredit的使用,请见:http://mumble.net/~campbell/emacs/paredit.html

2.0.6 集成HyperSpec

HyperSpec是由LispWorks公司维护的ANSI Common Lisp标准文档,类似于微软给开发人员提供的MSDN文档,在写Common Lisp代码时会经常参考它,但是直接通过浏览器访问LispWorks公司网站的HyperSpec太麻烦,本节将告诉您如何通过Slime来快速访问。

进入Slime模式后,按M-x执行slime-documentation-lookup,然后键入要查询的符号名,便可很方便查找文档。这时Emacs会启动浏览器(Firefox、Chrome等),打开LispWorks公司网站HyperSpec里对应的符号页面,当然我们也可以把HyperSpec下载到本地离线使用。

访问:http://www.lispworks.com/documentation/common-lisp.html ,并找到“downloaded”,然后将其下载并解压到本地某个目录中,如我放到到/opt/HyperSpec。

编辑~/.emacs,添加如下:

(setq common-lisp-hyperspec-root "/opt/HyperSpec/")

注意路径后面一定要以”/“结尾。

这样我们再查询符号时,便可以浏览离线文档了。

其实靠Chrome或者Firefox打开文档很不方便的,比如我们通过SSH在服务器上编程时,就很麻烦。我们希望用Emacs来浏览文档。

我们可以把w3m这个终端版的浏览器集成到Emacs中,便于我们在Emacs中浏览文档。

按下M-x,输入package-install,然后键入w3m回车,Emacs会自动安装。

安装好了后在~/.emacs键入如下内容:

(setq browse-url-browser-function
      '(("/opt/HyperSpec/" . w3m-browse-url)
        ; 除了查看HyperSpec用w3m,浏览其他页面还是用默认浏览器,这句话不是必须的
        ("." . browse-url-default-browser)))

3 相关资源

Common Lisp社区资源

开发参考 以下链接在开发Common Lisp程序时会经常用到: