
(Votre princesse préférée maintenant dans Emacs!)
Elsa est un outil qui analyse votre code sans le charger ou l'exécuter. Il est sans effet secondaire à 100% et nous nous efforçons de le garder ainsi, vous pouvez donc analyser n'importe quel code ELISP de n'importe où en toute sécurité.
Elsa ajoute un système de type puissant au-dessus d'Emacs Lisp (complètement facultatif). In peut suivre les types et fournir des conseils utiles lorsque les choses ne correspondent pas avant même d'essayer d'exécuter le code.
Table des matières
Les langages de programmation dynamique, tels que EMACS LISP, JavaScript et Python, ont de nombreux avantages par rapport aux langages typés statiquement comme Java ou C ++. Ils permettent un développement et un prototypage plus rapides en raison de leur nature dynamique, ce qui facilite l'écriture et le test rapidement.
Cependant, les langages dynamiques n'ont pas les fonctionnalités de vérification et de sécurité de type que fournissent les langages typés statiquement. Cela peut entraîner des erreurs difficiles à attraper pendant le développement et peut entraîner des problèmes de production. En ajoutant un système de type en plus d'une langue dynamique, nous pouvons profiter des avantages des langages dynamiques et statiques.
ELSA est un système de type et analyseur pour Emacs Lisp, qui vise à fournir les avantages d'un système de type tout en conservant la flexibilité et l'expressivité de LISP. Il est similaire à TypeScript pour JavaScript ou Python de type indice pour Python en ce qu'il fournit un moyen d'ajouter une vérification de type statique à une langue dynamiquement typée.
Elsa essaie d'être idiomatique et d'utiliser autant d'informations disponibles que possible, telles que les déclarations EDEBUG, les spécialisateurs DefMethod ou les types de créneaux de classe EIEIO, de sorte que la quantité de code qui doit être annotée est minimisée.
Nous sommes actuellement en phase bêta . L'API, le système de type et les annotations sont assez stables. Nous prenons en charge plusieurs façons d'installer et d'exécuter l'analyseur.
Elsa n'a pas beaucoup d'annotations de type pour les fonctions intégrées (il y en a environ 1500) et des variables. Les résultats de l'analyse sont donc encore sous-optimaux.
Les choses pourraient encore se casser à tout moment.
Voici une liste non exhaustive de certaines fonctionnalités plus intéressantes.
Les moments de mise en évidence des erreurs dans les captures d'écran sont fournis par Elsa Flycheck Extension.
Tout ce que vous voyez ici fonctionne réellement, ce n'est pas seulement pour le spectacle!


















downcase peut prendre une chaîne et retourner une chaîne ou prendre un int et retourner un int. Parce que nous passons une variable de chaîne s , nous pouvons désambiguïter la surcharge de la fonction doit être utilisée et nous pouvons dériver le type de retour de la fonction en tant que string au lieu de (or string int) .

Si nous passons une entrée qui ne correspond à aucune surcharge, ELSA affichera un rapport utile sur les surcharges disponibles et quel argument ne correspondait pas.

Elsa peut être exécuté avec Eask, Cask, Makem.sh ou Emake. Avant de pouvoir effectuer une analyse, consultez la section de configuration sur la façon de configurer le projet.
Le projet ELSA prend en charge les méthodes EASK, CASK et LSP. Pour le support Makem.sh et Emake, contactez directement les auteurs de ces packages.
Si vous utilisez Eask ou Cask, vous pouvez utiliser des intégrations Flycheck et Flymake (voir ci-dessous).
De plus, ELSA implémente également le protocole de serveur linguistique (LSP) et peut être utilisé avec le mode LSP. C'est la meilleure option car tout l'état est mis en cache dans le serveur et toutes les opérations sont très rapides. LSP expose également les fonctionnalités d'ELSA autrement non disponibles, telles que l'achèvement (via lsp-completion-mode ) ou les informations de type de volant contextuelles.
Le tableau suivant résume les options:
| Fonctionnalité | Eask | Fût | makem.sh | Ématiner |
|---|---|---|---|---|
| Analyse autonome de la CLI | ✓ | ✓ | ✓ | ✓ |
| Intégration de mouche | ✓ | ✓ | ⨯ | ⨯ |
| Intégration de mouches | ✓ | ⨯ | ⨯ | ⨯ |
| Protocole de serveur de langue (LSP) | ✓ | ✓ | ⨯ | ⨯ |
Remarque: Lorsque vous exécutez ELSA dans un projet pour la première fois, il est recommandé de le démarrer à partir de la CLI, car il devra explorer toutes les dépendances que vous utilisez et enregistrer les résultats de l'analyse dans les fichiers de cache. Cela peut prendre quelques minutes si vous avez de nombreuses dépendances (ou si vous incluez quelque chose comme org qui tire environ 300 autres packages).
Une fois les résultats mis en cache, la prochaine fois que vous en aurez besoin, Elsa peut les charger de Cache et c'est généralement très rapide.
Vous pouvez démarrer le LSP immédiatement, mais il ne répondra pas pendant le temps qu'il fait l'analyse initiale.
lint )Le moyen le plus simple d'exécuter Elsa avec Eask:
eask lint elsa [PATTERNS]
[PATTERNS] est facultatif; La valeur par défaut Lint tous vos fichiers de package.
exec )Cette méthode utilise Eask et installe Elsa de Melpa.
(depends-on "elsa") au fichier Eask de votre projet.eask install-deps .eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] pour analyser le fichier.exec ) Pour utiliser la version de développement d'ELSA, vous pouvez cloner le référentiel et utiliser la fonctionnalité eask link pour utiliser le code du clone.
git clone https://github.com/emacs-elsa/Elsa.git quelque part sur votre ordinateur.(depends-on "elsa") au fichier Eask de votre projet.eask link add elsa <path-to-elsa-repo> .eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] pour analyser le fichier. Cette méthode utilise Cask et installe Elsa à partir de Melpa.
(depends-on "elsa") au fichier Cask de votre projet.cask install .cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] pour analyser le fichier. Pour utiliser la version de développement d'ELSA, vous pouvez cloner le référentiel et utiliser la fonctionnalité cask link pour utiliser le code du clone.
git clone https://github.com/emacs-elsa/Elsa.git quelque part sur votre ordinateur.(depends-on "elsa") au fichier Cask de votre projet.cask link elsa <path-to-elsa-repo> .cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] pour analyser le fichier. L'implémentation LSP d'Elsa fonctionne actuellement en cours, mais le serveur est suffisamment stable pour qu'il soit utile de l'avoir. Cela rend le libellé très rapidement, car tout l'état est mis en cache dans l'instance du serveur et nous n'avons pas à relire tout le cache à partir de zéro (comme lors de la course sur Flycheck ou Flymake).
ELSA prend actuellement en charge le mode LSP, mais il n'est pas encore intégré au mode LSP lui-même car il (ELSA LSP) n'est pas assez stable. Pour utiliser ELSA LSP, Run (elsa-lsp-register) ou Mx elsa-lsp-register pour enregistrer le client au lsp-mode . Après cela, l'utilisation Mx lsp dans un tampon ELISP démarrera un espace de travail.
Actuellement, ces capacités de LSP sont prises en charge
| Capacité | Mis en œuvre |
|---|---|
| hoverprovider | Fournit des annotations de type contextuel des formulaires sous |
| textDocumentsync | OpenClose, sauf |
| complétion |
|
En utilisant makem.sh , exécutez simplement cette commande à partir du répertoire racine du projet, qui installe et exécute Elsa dans un bac à sable temporaire:
./makem.sh --sandbox lint-elsa
Pour utiliser un répertoire de bac à sable non temporaire nommé .sandbox et éviter d'installer Elsa à chaque cycle:
./makem.sh -s.sandbox --install-deps --install-linters ../makem.sh -s.sandbox lint-elsa . Voir la documentation de makem.sh pour plus d'informations.
Si vous avez déjà installé EMAKE, Run make lint-elsa . Vous devrez peut-être mettre à jour vers une version récente via EMAKE_SHA1 .
Sinon, installez Emake via les moyens habituels:
bash <( curl -fsSL https://raw.githubusercontent.com/vermiculus/emake.el/master/new ) Ce script vous demandera le nom de votre package, puis Bootstrap Emake. Vous pouvez désormais effectuer des chèques d'Elsa avec make lint-elsa .
Si vous utilisez FlyCheck, vous pouvez utiliser le package Flycheck-Elsa qui intègre ELSA à Flycheck.
Pour Flymake, vous pouvez utiliser Flymake-Elsa.
Pour l'instant, Elsa prend en charge très peu de configuration. Pour "Elsa-Onable" votre projet, vous devez ajouter un Elsafile.el à la racine de votre projet.
Elsa a un concept d'extensions et de sets de règles, qui existent actuellement principalement en interne et sont enveloppés dans un ensemble de règles et d'extension de «défaut» par défaut. Ce système est toujours en cours.
Voici quelques façons d'étendre ELSA aujourd'hui.
Une façon d'étendre l'ELSA consiste à fournir des règles d'analyse spéciales pour plus de formes et de fonctions où nous pouvons exploiter la connaissance de la façon dont la fonction se comporte pour réduire davantage l'analyse.
Par exemple, nous pouvons dire que si l'entrée de not est t , la valeur de retour est toujours nil . Cela code notre connaissance du domaine sous forme d'une règle d'analyse.
Toutes les règles sont ajoutées sous forme d'extensions. Elsa a quelques extensions de base pour les fonctions intégrées les plus courantes telles que la manipulation de la liste ( car , nth ...), les prédicats ( stringp , atomp ...), les fonctions logiques ( not , ...) et ainsi de suite. Ceux-ci sont automatiquement chargés car les fonctions sont si courantes, pratiquement chaque projet va les utiliser.
Des extensions supplémentaires sont fournies pour des packages externes populaires tels que Dash.el. Pour les utiliser, ajoutez à votre formulaire Elsafile.el le formulaire register-extensions , comme ainsi
(register-extensions
dash
; ; more extensions here
) Les extensions sont en charge automatique lorsque ELSA arrive sur un formulaire d'exigence. Pour un (require 'foo) il recherchera elsa-extension-foo.el et essaie de le charger. Cela signifie que dans la pratique, vous n'aurez jamais à enregistrer des extensions pour la plupart des packages tiers.
Une fois l'analyse des formulaires réalisée, nous avons toutes les informations de type et l'AST prête à être traitée davantage par divers contrôles et règles.
Celles-ci peuvent être (liste non exhaustive):
lisp-case pour la dénomination au lieu de snake_case .if avec un progn inutile.if n'évalue pas toujours à non-nil (auquel cas le formulaire if est inutile).ELSA fournit des ensembles de règles intégrés et plus peut également être utilisé en chargeant des extensions.
Pour enregistrer un ensemble de règles, ajoutez le formulaire suivant à Elsafile.el
(register-ruleset
dead-code
style
; ; more rulesets here
)Dans ELISP, les utilisateurs ne sont pas tenus de fournir des annotations de type à leur code. Alors que dans de nombreux endroits, les types peuvent être déduits, il existe des endroits, en particulier dans les fonctions définies par l'utilisateur, où nous ne pouvons pas deviner le type correct (nous ne pouvons déduire ce que nous voyons pendant l'exécution).
Lisez la documentation des annotations de type pour plus d'informations sur la façon d'écrire vos propres types.
Ouvrez un problème si vous souhaitez travailler sur quelque chose (pas nécessairement répertorié ci-dessous dans la feuille de route) afin que nous ne reproduisons pas le travail. Ou donnez-nous simplement des commentaires ou des conseils utiles.
Vous pouvez fournir des définitions de type pour les fonctions intégrées en étendant elsa-typed-builtin.el . Il y a beaucoup à faire. Certains des types nécessaires pour exprimer ce que nous voulons peuvent ne pas exister ou être soutenus encore, ouvrir un problème afin que nous puissions discuter de la façon de modéliser les choses.
Voir la discussion.
Après avoir appelé (require 'elsa-font-lock) il existe une fonction elsa-setup-font-lock qui peut être appelée à partir d' emacs-lisp-mode-hook pour configurer un verrouillage de police supplémentaire pour les types ELSA.
La plus grande inspiration a été le projet PHPSTAN, qui m'a donné l'impulsion initiale pour démarrer ce projet. J'ai parcouru leurs sources à plusieurs reprises pour trouver de l'inspiration et choisir des fonctionnalités.
La deuxième inspiration est TypeScript, qui a transformé un langage plutôt inintéressant en une puissance du (non seulement) Web.
J'emprunte massivement à ces deux projets et je prolonge ma gratitude et mon admiration.