🔖

Lem Advent Calendar 2023 - Lisp Mode - SLIMEとmicros

2023/12/08に公開

これは Lem Advent Calendar の記事です。

SLIMEとは

EmacsではCommon Lisp用のIDEのための拡張機能としてSLIMEが存在します。
SLIMEはSwank RPCというプロトコルを使って、Server/Client間で非同期の通信を行います。
これをベースに式の評価、シンボルの補完、関数の引数の表示、強力なREPL、Inspector、Debugger、stepper等をEmacs上で実現しています。
SLIMEはEmacs Lispによるクライアント(slime-mode)とCommon LispによるSwankサーバーから構成されています。

SLIMEの互換性の無さ

LemではEmacsのslime-modeを移植して使っていました。
サーバー側のswankはそのままを使い、Lisp Mode内にクライアントを実装していました。
ユーザーはSLIMEがあることを意識せずに使えるようになっています。

ところが、2023年にリリースされたSLIME 2.28でプロトコルに破壊的な変更が入り、
Lemで最新のswankサーバーを使おうとするとハングアップしてしまうようになりました。

SLIMEはEmacs LispによるクライアントとCommon Lispによるswankサーバーが同じリポジトリで管理されており、やや密結合した状態になっています。
サーバーとクライアントのslimeのバージョンが少しでも異なると警告が出るようになっています。
Lem以外にも他のクライアントの実装は存在するはずなのですが全て非公式です、多分今は動きません。
今までLemでバージョンを考えず動かせていたのですが、問題が起きなかったのは運がよかっただけのようです。

そもそもプロトコルにドキュメントが存在せずEmacs LispとCommon Lispのコードを読み解くしかないので、暗にEmacs専用ということになってるのかもしれません。
以前はバージョンが違うとよく壊れていたと聞きました。

考えられる案

2.28でのハングアップする問題自体はすぐに解決できたのですが、似たような箇所で微妙に挙動がおかしい点があり、結局理由はよくわかりませんでした。
今後も同じような問題が起こる事もあるかもしれません、出た案はいくつかありました。

  • 案1: SLIME 2.27を使い続ける
    2.27は動くので、これを使い続けようと言う話です。
    まあ悪くないかもしれませんがあまり面白くありません。
  • 案2: 頑張って都度対応する
    壊れる事はそんなに無いと見越して、壊れたころに何とかしようという案です。
    ただ、趣味プロジェクトなので常に活発に開発してるわけではありません。
    修正する必要が出たときに直せる気力があるとは限らず、もし気力が尽きているタイミングで運悪く壊れてしまうと、大変なことになってしまいます。
  • 案3: SLIMEに互換性について相談する
    SLIME自身が互換性の問題を考えればもうすこし状況は改善するのではないでしょうか。
    とはいえ外部のプロジェクトの人達を説得する必要があり、今回出た案の中で一番面倒です。
    多分相手も面倒なので難しいでしょう。
  • 案4: フォークする
    フォークして名前を変えたものを維持します。
    自分で壊さなければ使えなくなることは考えにくいですし、いざとなったら新しい機能も実装しやすくなります。

結局悩んだ末、案4を選択しました。
そこで出来たのがmicrosというリポジトリです。
https://github.com/lem-project/micros

名前を変える大変さ

名前を決めてフォークすることになったら名前が衝突しないようにコード内のslimeやswankという文字列をmicrosという文字列に変更する必要があります。
grepして置換してある程度はうまくいったのですが、いくつか漏れがあり、バグの原因になっていました。
今は問題なく動いていますが、プロトコルのメッセージ内や関数やコマンド名にslimeという名前が含まれてるのが直せていません。

おわりに

今回はmicrosというSLIMEのフォークしたプロジェクトについて紹介しました。
次回はSwank RPCプロトコルとその上で使う関数についてです。

Discussion