Siftは、Scheme、Emacs Lisp、Common Lisp向けに、冪等なフォーマッター、ルールベースのリンター、および言語サーバー(LSP)を提供することで、Lisp開発への統合的なアプローチを実現します。Lispソースをテキスト行のシーケンスとしてではなく、フォームのツリーとして扱うことで、このツールはフォーマットが「不動点」であることを保証し、繰り返し適用しても出力が変わらないようにします。

このアニメーションは、フォーマットとリンティングのための統合ツールチェーンとしてのSiftのコア機能を説明しています。
方言固有のロジック
Lispツールにおける主な課題の一つは、異なる方言が同じ文字を異なる目的で使用することです。例えば、角括弧はある方言ではベクトルを表し、別のほうでは節を表すことがあります。Siftは、各方言に固有のレポートを使用することで、これらのルールの間で妥協することを避けます。
このアプローチにより、GuileやGuixのコードベース、あるいはEmacsパッケージの開発など、特定のプロジェクトに取り組む学生や開発者は、汎用的な標準ではなく、それぞれの言語の慣習に沿ったフォーマットを受け取ることができます。
「Lispプログラムは読み取り構文を持つデータであり、それをそのように扱うフォーマッターは、正確さと低コストを同時に実現できる。」
— GitHub - jjba23/sift: Lisp, Scheme and Emacs Lisp formatter, linter and LSP (language server)
ロスレス・リライティングの仕組み
Siftは、Lispプログラムが読み取り構文を持つデータであるという前提で動作します。ファイルをソース位置を保持するフォームのツリーとして読み込むことで、このツールはコメントや特殊なフォームに関して「バイト単位で正確な」リライトを実行できます。

このコードリストは、Siftが異なる方言にわたって処理するLisp構文の具体的な例を提供しています。
リーダーとプリンターは逆の操作であるため、Siftは基礎となる構造を変更せずにホワイトスペースを移動させることができます。これにより、ツールは変更箇所を特定の変更として示す差分を提供でき、人間によるレビューと自動化パイプラインの両方に適しています。
ツールと統合
このプロジェクトは単一の実行ファイルとEmacsパッケージとして提供され、異なるエディタ間で一貫した体験を提供します。構造化データ用のJSON、コードスキャン用のSARIF 2.1.0、およびプルリクエスト用のGitHubアノテーションを含む、さまざまな出力形式をサポートしています。
言語サーバー(sift lsp)は、3つすべての方言に対して診断、クイックフィックス、およびフォーマットを提供します。また、「定義へ移動」、インレイヒント、ファイル名の変更などの機能も提供し、利用可能な場合は方言独自のコンパイラを「セカンドオピニオン」として使用します。
制限と安全性
Siftは攻撃的な自動化よりも正確性を優先します。「fix」コマンドは、等価として明示されている変更のみを適用し、パースエラーを引き起こす可能性のある修正は破棄します。また、識別子の名前変更や新しい区切り文字の捏造も行いません。
このツールは明確な根拠を伴う92のルールを提供していますが、大規模なリポジトリに関する具体的なパフォーマンスベンチマークは現在のドキュメントには含まれていません。ユーザーは「sift explain」コマンドを使用して、特定のルールの根拠を照会できます。