2025/05/11 17:38 LSP client in Clojure in 200 lines of code

ロボ子、今日のITニュースはClojure製の200行LSPクライアントじゃ。

LSPクライアントですか。ずいぶんと短いコードで実装できるものなのですね。

そうなんじゃ。この記事によると、言語サーバーと通信して、コードに関する質問に答える言語モデルを統合するプロトタイプとして開発されたらしいぞ。

なるほど。コマンドラインリンターを構築するために、言語サーバーを使うのですね。

LSPは、テキストエディタとプログラミング言語のツール間の通信を標準化するものじゃ。これによって、IDEとプログラミング言語の対応が楽になるんじゃ。

MxN問題をM+Nに軽減する、という部分ですね。言語作成者とIDE作成者の負担が減るのは素晴らしいです。

今回の実装では、言語クライアントとサーバー間の通信層、JSON-RPC層、そして言語サーバーとして機能するAPIを実装したらしいぞ。Java 24と仮想スレッドを使っているのがミソじゃな。

Java 24の仮想スレッドですか。ブロッキングコードのパフォーマンスが向上するのですね。

メッセージの構造はHTTPプロトコルに似ていて、ヘッダーとJSONメッセージ本体でフォーマットされたバイトストリームを使うんじゃ。

Content-Lengthで長さを指定するのですね。シンプルで分かりやすいです。

`start!`、`request!`、`notify!`の3つの関数がAPIとして提供されておる。LSPクライアントオブジェクトはキューとして実装されているのが面白い。

言語サーバーのライフサイクルは、初期化リクエストからシャットダウンリクエストまで、きちんと定義されているのですね。

Diagnosticは、コードの問題を記述するデータで、テキスト範囲や重要度を含むんじゃ。言語サーバーから診断を取得する方法として、document diagnosticsとworkspace diagnosticsの2つがある。

特定のファイルのlintingを要求するか、プロジェクト全体のlintingを要求するかで使い分けるのですね。

この記事の結論としては、LSPはエコシステムにとって有益だが、コマンドラインリンターの構築には適していないらしい。テキストエディタの構築には適しているとのことじゃ。

DefoldエディタのLSPサポートは、言語サーバーの管理が複雑なのですね。複数の言語サーバーを同時に実行すると、複雑さが増すのは当然かもしれません。

LSPの後継としては、プロセス間通信のためのより優れたプロトコルではなく、言語サーバーをインプロセスで、同期的に、WASMにコンパイルできるWASMインターフェースになる可能性がある、と。

WASMですか。確かに、言語に依存せずに記述できるのは魅力的ですね。

しかし、200行でLSPクライアントが作れるとは驚きじゃったな。私も負けてられんぞ!

博士なら、きっともっとすごいものが作れますよ!

よし、ロボ子!今夜は徹夜で300行のLSPクライアントを作るぞ!

えっ、行数が増えてる…?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。