Swank RPC プロトコルは、SLIME と Swank との間で用いられる、テキストベースの非同期通信プロトコルです。
SLIME は、Common Lisp でアプリケーションを開発するための Emacs モードで、IDE(統合開発環境)と呼べるほど強力な機能を備えています。
SLIME には、Swank と呼ばれるバックエンドがあります。Swank は、Common Lisp プロセスにロードされ、ソケットを経由して SLIME と通信します。このとき使用されるのが、Swank RPC プロトコルです。
Swank RPC プロトコルの概観
Swank RPC プロトコルは、6文字の16進数文字列とそれに続くS式、終端の改行文字で構成されます。
000016(:return (:ok nil) 1)\n
先頭の16進数文字列は、続くS式の長さ(最後の改行文字を含む)を表します。S式は、SLIME や Swank によって読み込まれます。S式の最初の要素はメッセージの種類を表すキーワードで、残りの要素がその引数です。
メッセージには、以下のような種類があります。
- :emacs-rex
- :return
- :indentation-update
- :new-features
Swank RPC プロトコルによるS式の評価
たとえば、(+ 3 4)というS式を Swank で評価するには、以下のメッセージを送信します。
00002c(:emacs-rex (+ 3 4) "COMMON-LISP-USER" t 1)\n
最初の6文字は続くS式の長さで、改行文字を含め44文字のため、16進数で2cとなります。
メッセージの種類は :emacs-rex (Remote EXecute SEXP)で、第一引数が評価するS式、第二引数がそのときのカレントパッケージです。第三引数はS式の評価を行う Swank 側のスレッドを表し、第四引数は戻り値を受け取る継続を意味します。
S式が評価されると、Swank からは以下のようなメッセージが返信されます。
000013(:return (:ok 7) 1)
最初の6文字は、送信されたメッセージと同様にS式の長さを表し、19文字のため、16進数で13となります。
戻り値を表すメッセージは、:return です。評価に成功した場合、第一引数の最初の要素が :ok となり、二番目の要素に評価した結果の値が入ります。ここではその値は7です。第二引数は、送信されたメッセージの第四引数に含まれていた継続がそのまま返されます。
まとめ
このように、Swank RPC プロトコルでは、S式で表現されたテキストベースのメッセージが相互にやりとりされます。SLIME と Swank のやり取りの様子は、Emacs の *slime-events* バッファでみることができます。