CL入門 No.3 - エディタ

Common Lispで開発していく

Common Lispの代表的な処理系はREPL*1が搭載してあるので、
言語処理系のみで開発を進めていくことができます。*2

またはLoad*3することで外部ソースコードを読み込むことができるので、
何らかのテキストエディタさえあれば、コードを書いて開発する事も出来ます。

ですが今回は、
Common Lisp開発ツールとして
広く使われているEmacs(Slime)を紹介したいと思います。

1. Slime (Emacs + Swank)とは?

Emacs?

Emacsは伝統あるテキストエディタです。
高機能性・高拡張性がウリであり、国際的に熱心なユーザが多いです。

Emacsには、Emacs Lispと呼ばれるLisp方言が使われています。
Lispでの開発に利用するにはうってつけというわけです。

Linuxでのインストール

GNU/Linux系であれば、公式のパッケージ管理システムに登録されていると思います。
OSのパッケージ管理システム経由でインストールしましょう。

Macでのインストール

有志によるosx向けemacsインストーラがあります。
http://emacsformacosx.com/

Windowsでのインストール

GNU/Emacsの公式でWindows用バイナリが配布されています。
http://ftp.gnu.org/gnu/emacs/windows/

参考:http://maruta.be/emacs/1

Windows向けのEmacs環境は他にもあるので、
好みのものを選択するといいと思います。

Slime?

SlimeはEmacs上でCommon Lisp開発するために作成された環境です。
http://common-lisp.net/project/slime/
いわゆる統合開発環境とも言われるものです。*4

Slimeは次のような特徴があります。

  • Swank(Common Lispサーバ)とSlime(クライアント)に分かれる
  • 実行時リロードによる対話的な開発
    1. エディタでコードを修正
    2. 修正部分だけコンパイル
    3. コンパイルした箇所を即時反映

2. Slime導入法(Quicklisp経由)

QuicklispにはSlime環境インストール用のヘルパーがあるので利用しましょう。

(ql:quickload :quicklisp-slime-helper)

実行すると次のようなテキストが出力されるので、
ホームディレクトリに .emacs というファイルを作成し、
3行のスクリプトを貼りつけておきましょう。

To use, add this to your ~/.emacs:

  (load (expand-file-name "~/quicklisp/slime-helper.el"))
  ;; Replace "sbcl" with the path to your implementation
  (setq inferior-lisp-program "sbcl")

細かい設定をしなければ、これで導入は終了です。
emacsを立ち上げて、「M-x slime」*5と入力するとSlimeが使用できます。

3. Slimeの基本操作

Emacsの基本操作

有志の方が日本語で操作方法をまとめてくれています。
http://www.bookshelf.jp/texi/emacs-20.6-man-jp/emacs.html#SEC_Top

とりあえず最低覚えておきたいショートカットは次のものです。*6

  • C-g コマンド入力のキャンセル
  • C-x C-c 終了
  • C-x C-f ファイルを開く
  • C-x C-s ファイルを保存
  • C-x 1 画面を一つに
  • C-x 2 画面を横に分割
  • C-x 3 画面を縦に分割
  • C-x o 次の画面に移動
  • C-x b 画面のバッファを切替
  • C-x k バッファの消去

他にも効率的にソースコードを編集するために、
コピー&ペーストやアンドゥ機能は覚えておいて損はないです。

Slimeにおけるバッファ

Emacsでは編集単位としてバッファというものがあります。
例えばファイルを開くと、ファイル毎に1つのバッファが割り当てられます。

Slimeでは次のようにバッファを使っていきます。

  • 開始時にREPL用バッファが開く
  • デバッグ時などにはデバッガ用バッファが開く
  • その他ドキュメントやコマンドリストなどもバッファが開く

Slimeの基本操作

Slimeの公式ドキュメントに細かい操作説明が載っています。
http://common-lisp.net/project/slime/doc/html/

まず覚えておきたいコマンドはこちらです。

  • M-x slime Slimeの起動
  • M-x slime-quit-lisp SlimeのSwankサーバを終了
  • M-x slime-restart-inferior-lisp Lispの再起動
  • C-c C-c (ファイルバッファで)カーソルがある式をコンパイル&ロード
  • C-c C-k (ファイルバッファで)ファイル全体をコンパイル&ロード
  • C-c C-l ファイル名を指定してロード
  • C-c C-z REPLに移動
  • M-. シンボルの定義にジャンプ
  • M-, 前回のM-.ジャンプ先に戻る
  • M-x slime-inspect インスペクトモード*7を開く

たくさん機能がありますが次が基本的な流れになります。

  1. ソースコードを書く
  2. C-c C-c またはC-c C-kでコンパイル
  3. C-c C-z でREPLを開き、動作を確認する

4. Slimv (vim + Swank)

Slimvはvim用のSlimeクローン環境です。
http://www.vim.org/scripts/script.php?script_id=2531

何らかの理由でEmacsよりもvimを選択している人は、
こちらを利用してみるといいかもしれません。

今回は導入方法は紹介し切れないのでカットします。
いずれ導入方法をまとめるかもしれません。

まとめ

Slimeは多機能なので、全ての機能を一度に紹介することはできません。*8

次回は環境構築から離れて、
Common Lispプログラミングを始めていきたいと思います。
最初は、REPL上での計算処理からです。

明日からは少し忙しいので、次の更新は
ゴールデンウィーク最後のほうになると思います。

*1:Read-Eval-Print-Loopの略。対話型のプログラム環境として使えます。

*2:開発途中の記録を保存する機能はまた後の記事で紹介する予定です。

*3:Load関数はCommon Lisp標準の外部ソースファイルを実行する関数。実はQuicklispのインストール時に使用していました。

*4:とは言ってもCommon Lispには標準でコンパイラやデバッガツールが搭載されているので、フロントエンドの部分以外はほとんどCommon Lisp標準機能です。

*5:M-xはEmacsコマンドを入力するキー操作です。Mはメタキーを表しますが、現在の環境だとEscキーを一度押してからキーを打つことで代用できます。

*6:C- はCtrlを押しながら、M- はメタキー(Esc)を一度押した後にの略記です。

*7:Lisp内のオブジェクトを詳細に閲覧できる機能。Inspectに関してはまた別途記事にする予定です。

*8:sldbやslime-inspectorなどはよく使用する機能になります。