2014年12月1日月曜日

Swank RPC プロトコル


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* バッファでみることができます。