Common Lisp開発環境を新規に作ったのでメモ

JavaScriptの本「JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック」を買ったのでCommon Lispの環境を新規に作ってみました(正しい日本語です)。

Emacsには抵抗がなく、これからCommon Lispを始めたいという人にもちょうど良いぐらいの内容ではないかと思います。ということで、そんな体で書いていきます。

以下の状況からスタートします。基本的には本書の「第1章03 環境を構築しよう」が完了した時点と思えば良いです。

CL開発環境の構築は基本「Modern Common Lisp」を参照すれば良いと思っていますが、主な差分は以下の点です。

  • 処理系はRoswellを通して入れましょう
    • 色々楽になる
    • quicklispのインストールも不要になる
  • Emacsは24以降を入れましょう
    • 上記で紹介されているあれこれのEmacs拡張が簡単にインストールできる

ここではほぼ入れ方しか書いていないので、使い方は同リンクを参考にすると良いです。

Emacs24.5のインストール

Emacs 24以降は標準でパッケージマネージャ(init.elからはpackage-installで利用可)がついているのでこれをインストールします(yumで入るのはもう少し古いはずです)。下記は執筆時点で最新の24.5の例です。

sshからの利用を前提にしているので、--without-xを入れている辺りがポイントでしょうか。

$ sudo yum install lcurses-devel
$ wget http://mirror.jre655.com/GNU/emacs/emacs-24.5.tar.gz
$ tar zxvf emacs-24.5.tar.gz
$ cd emacs-24.5
$ ./configure --without-x
$ make
$ sudo make install

Roswellをインストール

※この先はおおむねスクリプト化しています(記事末尾に貼り付け)。Emacsだけスクリプトに入っていないのは単にそういう手順で入れてしまったからで、特に意味はありません。

少しだけRoswellの説明

Common LispではSBCLやらClozure CLやら処理系が色々あったり、意外とインストールに失敗したりと入り口でつまづきがちです。

今ならとりあえずRoswell入れておけばこうした煩わしさから解放されます。このRoswell自体は処理系ではありません。入れておくとシェル上からros install sbcl-binros install ccl-bin*2とコマンドを一発叩くだけで主要な処理系をインストールすることができるようになります。しかも、Common Lispにおけるパッケージ管理のデファクトであるquicklispレディな状態でインストールされるため、quicklispのインストール手順も省略できます。

Roswellは処理系インストールだけが機能ではないので、深町さんによる紹介記事「Common Lispとリアル・ワールドを繋ぐ「Roswell」の紹介 - 八発白中」等も参考にすると良いです。

インストール

基本的には普通のconfigure, make, make installですが、先に必要なものを入れておきます。

まずyumで色々入れます。この先で必要なものもまとめてしまったので、どれがRoswell入れる上で最低限だったか覚えていないです…(libcurlぐらいだったような…)。

$ sudo yum -y install libcurl-devel zlib-devel perl-ExtUtils-MakeMaker

CentOS 6系では大抵autoconfのバージョンが古くてconfigureに失敗するので、2.65未満の場合は新しいバージョンを入れておきます。

$ wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
$ tar zxf autoconf-2.69.tar.gz
$ cd autoconf-2.69
$ ./configure
$ make
$ sudo make install

いよいよRoswellを入れます。

$ git clone -b release https://github.com/roswell/roswell.git
$ cd roswell
$ sh bootstrap
$ ./configure
$ make
$ sudo make install

ros runと打ってみると(初回のみ)SBCLがインストールされた後にREPLが起動します(下記はインストールの出力は略)。

$ ros run
* (+ 1 2)

3
* (quit)

オプション

ここで説明するものは、Emacs + Common Lispな環境をセットするだけであればオプションですが、下記に貼り付けた.emacs.d/init.elでは前提になっています。概要のみ記述しますので、インストール方法の詳細は末尾のスクリプトを参照してください。

より新しいバージョンのGitを入れる

EmacsからGitを操作できるmagitという拡張がありますが、(執筆時点で)バージョン1.9.4以降のgitを求められます。yumで入るものは1.7系とやたら古いので新しいものを入れておきます。

ちなみに、個人的にmagitで特に重宝しているのは、git branchなどリポジトリのファイルを書き換える操作を行った時に、バッファ内のファイルをアップデートしてくれるという点です。基本的に開いたバッファは開きっぱなしなので大変助かってます。また、いったんM-x magit-statusで開いてしまえば、主要な操作方法はhキーを押せばいつでも見られるという点も助かる点です。

HyperSpecをローカルに入れておく

HyperSpecCommon Lisp仕様書…ではありませんが、事実上仕様書のようなものです。頻繁に利用することになるので、Emacsからローカルに参照できるようにしておくと便利です。

slime-repl-ansi-color.elを入れる

SLIME(参考:モダンCommon Lisp第3回: SLIMEの使い方 基礎編 | ありえるえりあ)で色の表示を可能にする拡張です。

Emacsの設定と準備用スクリプト

新規環境であれば、Emacsを入れたら後は下記のスクリプトを走らせて、.emacs.d/init.elに下記の内容をコピーするだけでも動くはずです。

あくまで自身のメモを兼ねているので、最小限の環境ではないです。が、お勧め設定+αぐらいに割りと収まっていると思います、きっと…。

prepare.sh

上記で書いてきたEmacs以外のインストールをまとめたスクリプトです。注意ですが、平気でprefixなしのsudo make installをしているので既存環境でいきなり走らせることはお勧めしません。

何点か補足。

  • L37: gitのバージョンチェックが超雑です
  • L70: SBCLのインストールも済ませてしまおうと、一回Roswellを起動・終了しています

gist.github.com

~/.emacs.d/init.el

余り害のあるものは入れていないつもりです。ただし、慣れないうちはparedit関係のものはコメントアウトしておくと良いと思います。;; paredit(108行目)とコメントがある少し下のadd-hook3つをコメントアウトしておけば特に害はないはずです。なお、気になってきたら「ParEdit チュートリアル」辺りを参考に試してみると良いと思います。慣れれば非常に快適です。

Common Lispに直接関係のあるものは81行目(;; ----- Lisp ----- ;;とコメントのある行)以降です。

何点か補足。

gist.github.com

*1:どう見てもCentOS 6.5が落ちてくるようなアドレスですが、試した時には6.7でした。今後もアップデートされそうな気がします

*2:CentOS 6系ではClozure CLの最新版はGLIBCが古くて動かないです。その場合、ros install ccl-bin/1.9 とすれば古いものを入れられます