突発性CL勉強会1回 SLIMEについて

突発性CL勉強会でSLIMEについて勉強。
id:g000001さん、id:mokeheheさん、NANRIさんとid:tszの4人で実施。
新宿大ガード横店は改装工事をしていたので、近くの別店に移動しました。
新宿のルノアールで7時間実施。SLIMEの話題自体は2〜3時間で終わりましたが、
その後の話が熱かったです。gooやdylanにも興味が出てきました。

以下は勉強会の内容と、その後自宅でおさらいした内容。

SLIME概要

emacs向けのCommonLisp開発環境。
SLIMEはemacsで動作する部分と、lisp側で動作する部分からなる。
lisp側で動作する部分はswankと呼ばれる。
emacsはswankとはS式と通じて通信する。
つまり、swankのプロトコルを理解する処理系であればCommonLispでなくても良い。
schemeやgoo,dylanなどのswankがある模様。
今回はCVS版を題材にした。

日本語問題

いくつかの処理系のswankでは日本語の取り扱いがうまくいかない。
sbclやAllegro CL、clisp,clozureはOK。

使用形態

emacsのslimeからswankサーバも一緒に起動。あるいは、swankサーバを別に立ててemacsから明に接続する。
一緒に起動するのは特に設定が必要なく、お手軽。
swankサーバに明に接続する方法の場合、lispが同一ホストで動作している必要はない。
複数のlispを相手にする場合、swankサーバに接続する方法にする。
swankサーバを含んだimageファイルを作っておくと起動が速くなる。

明に接続する方法

swankはasdfで使用可能なため、asdfリポジトリからswank.asd
シンボリックリンクを張る。
sbclの場合、~/.sbcl/systemsから張れば良い。

$ pwd    
~/.sbcl/systems
$ ln -s ~/cl/slime/swank.asd

sbclでswankサーバを起動

$ sbcl
This is SBCL 1.0.16, 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.
* (require :asdf)

("ASDF")
* (require :swank)

; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank-backend.fasl"
; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank-source-path-parser.fasl"
; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank-source-file-cache.fasl"
; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank-sbcl.fasl"
; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank-gray.fasl"
; loading #P"/Users/TakayukiSuzuki/.slime/fasl/2008-04-24/sbcl-1.0.16-darwin-x86/swank.fasl"
WARNING: These Swank interfaces are unimplemented:
 (CALLS-WHO DISASSEMBLE-FRAME SLDB-BREAK-AT-START SLDB-BREAK-ON-RETURN
            WHO-SPECIALIZES)
("SB-GROVEL" "SB-BSD-SOCKETS" "SB-INTROSPECT" "SB-POSIX" "SB-CLTL2")
* (swank:create-server :port 6006)
;; Swank started at port: 6006.

6006
* 

swankサーバへの接続は、M-x slime-connetで行える。
IPアドレスとポート番号を指定する。

処理系の選択

.emacsでslime-lisp-implementationsへ設定しておく。

(setq slime-lisp-implementation
      `((sbcl ("sbcl" :coding-system 'utf-8-unix))
	(acl ("~/cl/AllegroCL/alisp") :coding-system utf-8-unix)))

こうすると、 C-u - M-x slime で選択出来るようになる。

slime/contrib以下のファイル

色々おまけ機能がある。
(slime-setup '(...))で読みこむらしい。
取りあえず片っ端から取り込む。

(slime-setup
 '(
   inferior-slime
   slime-asdf
   slime-autodoc
   slime-banner
   slime-c-p-c
   slime-editing-commands
   slime-fancy-inspector
   slime-fancy
   slime-fuzzy
;   slime-highlight-edits
   slime-parse
   slime-presentation-streams
   slime-presentations
   slime-references
   slime-scratch
   slime-tramp
;   slime-typeout-frame
   slime-xref-browser
   ))

便利な機能(コンパイル編)

オススメマークは、tszが多分よく使うと思う機能。

オススメ キーバインド 機能
x C-c C-c 現在編集中の関数をコンパイル
x C-x C-e 直近のS式を評価してMessage領域へ表示
C-x C-r リージョンを評価してMessage領域へ表示
x C-x C-p 直近のS式を評価して新バッファへ表示。バッファはqでクローズ
x C-M-x 編集中のS式をトップレベルから評価
C-c C-k 現在編集中のファイルをコンパイルしてロード
C-c C-l 現在編集中のファイルをロード
x M-n コンパイルエラーの箇所へ移動(次)
x M-p コンパイルエラーの箇所へ移動(前)
C-c M-d 関数の逆アセンブル結果を新バッファへ表示。バッファはqでクローズ

便利な機能(編集/調査編)

オススメ キーバインド 機能
x M-. 定義場所へ移動
x M-, 移動前の場所へ戻る
C-M-t S式の位置の入れ替え。C-M-tした位置の前後にあるS式の位置を入れ替える。
x M-C-i シンボル補完 m-v-b => multiple-value-bindなど
x C-c C-i 同上
C-c M-i fuzzyにシンボル補完。関数名をうろ覚えのとき便利。別バッファに候補一覧が表示されるのでC-n/C-pで選択しスペースで決定
C-c C-z replを表示
x M-x slime-selector いろんなバッファへ簡単移動。C-;あたりにバインドしておくと便利
C-c C-d C-d シンボルの情報表示
C-c C-d C-f シンボルの関数情報表示
C-c C-d C-a Apropos検索
C-c C-d C-p Apropos検索。パッケージ限定
C-c C-d h シンボルをHyperSpec検索。カーソル位置のシンボルの仕様を表示。
C-c C-d ~ Format directiveをHyperSpec検索。
x C-c C-m マクロ展開
x C-c M-m マクロ全展開
C-c C-f シンボルの関数情報表示
x C-c C-] トップレベルまでの括弧を閉じる
C-c M-q 関数の再インデント
C-c 呼び出しもと関数一覧を表示。 qで終了
C-c > 呼び出し先関数一覧を表示。 qで終了
C-c I オブジェクトのインスペクト

便利な機能(移動編)

オススメ キーバインド 機能
C-M-a 関数単位で移動(前)
C-M-e 関数単位で移動(後ろ)
C-M-f S式単位で移動(前)
C-M-b S式単位で移動(後ろ)
C-M-n リスト単位で移動(前)
C-M-p リスト単位で移動(後ろ)
C-M-u 上位のリストに移動
C-M-d リストの中に入る

便利な機能(デバッグ編)

オススメ キーバインド 機能
C-c C-b Replをbreak
x C-c C-t 関数トレースのトグル
x C-c C-y 現在編集中の関数名をreplへ送る。ちょっとしたテストに便利
C-c E シンボル値の編集。別バッファが開いて値の編集が可能に。C-c C-cでcommit
C-c ~ パッケージの同期
C-c C-x c 接続しているLispのリストを表示する。 dでdefault接続のlispを変更できる
C-c C-x t default接続のスレッド一覧を表示する。
M-x slime-toggle-profile-fdefinition 指定した関数のプロファイリングをトグル
M-x slime-profile-report プロファイル結果をレポート
M-x slime-unprofile-all 全関数のプロファイルを中止する
M-x slime-profiled-functions プロファイリングをしている関数の一覧を表示