
(今のお気に入りの王女は今エマックにいます!)
Elsaは、コードをロードしたり実行したりせずに分析するツールです。それは100%の副作用がないので、私たちはそれをそのように保つよう努めているので、どこからでも安全にELISPコードを分析できます。
Elsaは、Emacs Lisp(完全にオプション)の上に強力なタイプシステムを追加します。 IN CAN CAN TRACKESTを、コードを実行しようとする前に物事が一致しないときに役立つヒントを提供します。
目次
EMACS LISP、JavaScript、Pythonなどの動的プログラミング言語は、JavaやC ++などの静的にタイプされた言語よりも多くの利点があります。動的な性質のために開発とプロトタイピングを高速化できるため、コードをすばやく書き、テストしやすくなります。
ただし、動的な言語には、静的にタイプされた言語が提供するタイプチェックと安全機能がありません。これにより、開発中にキャッチするのが難しく、生産に問題を引き起こす可能性のあるエラーにつながる可能性があります。動的言語の上にタイプシステムを追加することで、動的言語と静的言語の両方の利点を享受できます。
ELSAは、EMACS LISPのタイプシステムおよびアナライザーであり、LISPの柔軟性と表現力を保持しながら、タイプシステムの利点を提供することを目的としています。 JavaScriptまたはPythonタイプのヒントのTypeScriptに似ています。これは、動的に型付けされた言語に静的タイプチェックを追加する方法を提供するという点です。
Elsaは、Edebug宣言、DefMethodスペシャライザー、またはEIEIOクラススロットタイプなど、慣用的であり、可能な限り利用可能な情報を使用しようとするため、注釈を付ける必要があるコードの量が最小限に抑えられます。
現在、ベータ段階にあります。 API、タイプシステム、および注釈は非常に安定しています。アナライザーをインストールして実行するための複数の方法をサポートしています。
Elsaには、組み込み関数(約1500個)と変数には多くのタイプの注釈がありません。したがって、分析結果は依然として最適です。
物事はいつでも壊れるかもしれません。
ここには、より興味深い機能の網羅的ではないリストがあります。
スクリーンショットのエラーハイライトは、Elsa Flycheck拡張機能によって提供されます。
ここで見るものはすべて実際に機能します。これはショーだけではありません!


















downcase 、文字列を取得して文字列を返したり、intを取り、intを返すことができます。文字列変数sを渡すため、どの関数の過負荷を使用する必要があるかを明確にすることができ、関数の戻り型をstring (or string int)として導き出すことができます。

過負荷と一致しない入力を渡すと、ELSAは、どの過負荷が利用可能であり、どの引数が一致しなかったかについての役立つ報告を示します。

Elsaは、Eask、Cask、Makem.sh、またはEmakeで実行できます。分析を実行する前に、プロジェクトの構成方法に関する構成セクションを参照してください。
ELSAプロジェクトは、Eask、Cask、LSPメソッドのサポートを提供します。 makem.shおよびemakeサポートについては、これらのパッケージの著者に直接お問い合わせください。
EaskまたはCaskを使用する場合は、FlyCheckとFlyMakeの統合を使用できます(以下を参照)。
さらに、ELSAは言語サーバープロトコル(LSP)も実装し、LSPモードで使用できます。これは、すべての状態がサーバーでキャッシュされ、すべての操作が非常に高速であるため、これは最良のオプションです。 LSPは、完了( lsp-completion-mode経由)やコンテキストホバータイプ情報など、使用できないELSAの機能も公開します。
次の表には、オプションをまとめます。
| 特徴 | イースト | 樽 | Makem.sh | emake |
|---|---|---|---|---|
| CLIからのスタンドアロン分析 | ✓✓ | ✓✓ | ✓✓ | ✓✓ |
| FlyCheckの統合 | ✓✓ | ✓✓ | ⨯ | ⨯ |
| Flymake統合 | ✓✓ | ⨯ | ⨯ | ⨯ |
| 言語サーバープロトコル(LSP) | ✓✓ | ✓✓ | ⨯ | ⨯ |
注:プロジェクトでELSAを初めて実行するときは、使用するすべての依存関係をクロールし、分析結果をファイルをキャッシュする必要があるため、CLIから開始することをお勧めします。多くの依存関係がある場合(または、他の約300のパッケージを引き込むorgのようなものを含める場合)、これには数分かかります。
結果がキャッシュされた後、次回必要なときにELSAがキャッシュからそれらをロードでき、これは一般的に非常に高速です。
LSPをすぐに開始できますが、最初の分析を行っている間は反応しません。
lint経由)EASKでELSAを実行する最も簡単な方法:
eask lint elsa [PATTERNS]
[PATTERNS]はオプションです。デフォルトは、すべてのパッケージファイルを並べます。
execを介して)この方法ではEaskを使用し、MelpaからELSAをインストールします。
Easkファイルに追加(depends-on "elsa")を追加します。eask install-deps実行します。eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...]ファイルを分析します。execを介して) ELSAの開発バージョンを使用するには、リポジトリをクローンし、 eask link機能を使用してクローンからコードを使用できます。
git clone https://github.com/emacs-elsa/Elsa.gitEaskファイルに追加(depends-on "elsa")を追加します。eask link add elsa <path-to-elsa-repo> 。eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...]ファイルを分析します。 この方法では、Caskを使用し、MelpaからElsaをインストールします。
Caskファイルに(depends-on "elsa")を追加します。cask installを実行します。cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...]ファイルを分析します。ELSAの開発バージョンを使用するには、リポジトリをクローンし、 cask link機能を使用してクローンからコードを使用できます。
git clone https://github.com/emacs-elsa/Elsa.gitCaskファイルに(depends-on "elsa")を追加します。cask link elsa <path-to-elsa-repo>を実行します。cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...]ファイルを分析します。 ElsaのLSP実装は現在作業中ですが、サーバーは十分に安定しているため、オンにすると便利です。すべての状態がサーバーインスタンスでキャッシュされており、キャッシュ全体をゼロから非常に読み直す必要がないため、糸くずを非常に速くします(FlyCheckやFlyMakeを実行しているときなど)。
現在、ELSAはLSPモードをサポートしていますが、LSPモード自体にまだ組み込まれていません(Elsa LSP)は十分に安定していないためです。 Elsa LSP、Run (elsa-lsp-register)またはMx elsa-lsp-registerを使用して、クライアントをlsp-modeに登録します。その後、ELISPバッファーでMx lspを使用すると、ワークスペースが開始されます。
現在、これらのLSP機能がサポートされています
| 能力 | 実装 |
|---|---|
| HoverProvider | ポイントの下でのフォームのコンテキストタイプの注釈を提供します |
| textDocumbutionYnc | openclose、保存 |
| 完了Provider |
|
makem.shを使用して、Project Root Directoryからこのコマンドを実行するだけで、ELSAを一時的なサンドボックスにインストールして実行します。
./makem.sh --sandbox lint-elsa
.sandboxという名前の非同時のサンドボックスディレクトリを使用し、各実行にELSAのインストールを避けるには:
./makem.sh -s.sandbox --install-deps --install-linters 。./makem.sh -s.sandbox lint-elsa 。詳細については、 makem.shのドキュメントを参照してください。
既にEmakeをインストールしている場合は、 make lint-elsaを実行してください。 EMAKE_SHA1を介して最近のバージョンに更新する必要がある場合があります。
それ以外の場合は、通常の手段でEmakeをインストールします。
bash <( curl -fsSL https://raw.githubusercontent.com/vermiculus/emake.el/master/new )このスクリプトは、パッケージの名前を求めて、Bootstrap Emakeを求めます。 make lint-elsaでElsaのチェックを実行できるようになりました。
FlyCheckを使用する場合は、ELSAをFlyCheckと統合するFlyCheck-Elsaパッケージを使用できます。
Flymakeには、Flymake-Elsaを使用できます。
今のところ、ELSAは構成がほとんどサポートされていません。プロジェクトを「Elsa-enable」にするには、プロジェクトのルートにElsafile.elを追加する必要があります。
ELSAには拡張機能とルールセットの概念があり、現在は主に内部に存在し、1つの大きな「デフォルト」ルールセットと拡張機能に包まれています。このシステムはまだ進行中です。
以下は、今日ELSAを拡張できるいくつかの方法です。
ELSAを拡張する1つの方法は、機能がどのように動作して分析を絞り込むかについての知識を活用できる、より多くのフォームと機能のための特別な分析ルールを提供することです。
たとえば、 notの入力がtである場合、戻り値は常にnilあると言えます。これは、分析ルールの形でドメインの知識をエンコードします。
すべてのルールは、拡張機能の形で追加されます。 Elsaには、リスト操作( car 、 nth ...)、Predicates( stringp 、 atomp ...)、論理関数( not 、...)など、最も一般的な組み込み関数のコア拡張機能はほとんどありません。機能がほぼすべてのプロジェクトがそれらを使用するため、これらは自動的にロードされます。
Dash.elなどの人気のある外部パッケージには、追加の拡張機能が提供されています。それらを使用するには、あなたのElsafile.elにregister-extensions形式を追加してください。
(register-extensions
dash
; ; more extensions here
) ELSAが必要なフォームに登場すると、拡張機能が自動ロードされます。 (require 'foo)の場合、それはelsa-extension-foo.elを探し、それをロードしようとします。これは、実際には、サードパーティのほとんどのパッケージの拡張機能を登録する必要がないことを意味します。
フォームの分析が行われた後、すべてのタイプ情報と、さまざまなチェックとルールによってさらに処理する準備ができています。
これらは(網羅的ではないリスト)にすることができます:
snake_caseの代わりに、変数がlisp-caseを使用してネーミングに使用することを確認するなど、文体的。prognのif他のブランチをラッピングしていません。if if条件が常にnon-nilに評価されるとは限らないことをチェックするなど。ELSAは、いくつかの組み込みのルールセットを提供し、拡張機能を読み込むことでも使用できます。
ルールセットを登録するには、次のフォームをElsafile.elに追加します
(register-ruleset
dead-code
style
; ; more rulesets here
)ELISPでは、ユーザーはコードにタイプの注釈を提供する必要はありません。多くの場所でタイプが推測できますが、特にユーザー定義の関数には場所があり、正しいタイプを推測できません(実行時に見られるもののみを推測できます)。
独自のタイプの作成方法の詳細については、タイプアノテーションドキュメントをお読みください。
何かに取り組みたい場合は問題を開きます(必ずしもロードマップに以下にリストされているわけではありません)。または、フィードバックや役立つヒントを提供してください。
elsa-typed-builtin.el拡張することにより、組み込み関数のタイプ定義を提供できます。行くことがたくさんあります。私たちが望むものを表現するために必要ないくつかのタイプのいくつかは、まだ存在しないか、まだサポートされていないかもしれません。問題を開いて、物事をモデル化する方法を議論できるようにします。
議論を参照してください。
呼び出した後(require 'elsa-font-lock) emacs-lisp-mode-hookから呼び出すことができる関数elsa-setup-font-lockがあり、ELSAタイプの追加のフォントロックを設定できます。
最大のインスピレーションはPHPSTANプロジェクトで、このプロジェクトを開始するための最初の推進力を提供してくれました。私は彼らの情報源を何度も見て、インスピレーションを見つけて機能を選びました。
2番目のインスピレーションはタイプスクリプトで、かなり興味のない言語を(単なる)Webの大国に変えました。
私はこれらのプロジェクトの両方から大いに借りて、感謝と賞賛を拡大しています。