Common Lisp 开发环境

Table of Contents

1. Common Lisp 实现

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

主流的商业实现有 LispWorks、Allegro CL,它们的价格都不便宜(都是好几千),虽然都可以免费使用,但有诸多限制,比如 LispWorks 有运行时间限制,超时会提示“You are approaching the time-limit for the Personal Edition of LispWorks.”。

推荐 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 开发比较活跃,在 GNU/Linux 上性能表现也不错。

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

$ 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:

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

2.0.4. 在 Emacs 中加载 Slime

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

;; 设置 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+x,输入 slime 并回车,如果能成功加载 Slime,说明安装没问题。加载成功后即可进入 REPL:

CL-USER>

此时可以输入 S 表达式。Slime 可以帮助补全内置的符号名,比如输入 defu,然后按下 C-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 键入如下内容:

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

3. 相关资源

Common Lisp 社区资源

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