
(¡Tu princesa favorita ahora en emacs!)
Elsa es una herramienta que analiza su código sin cargarlo o ejecutarlo. Está al 100% sin efectos secundarios y nos esforzamos por mantenerlo así, para que pueda analizar cualquier código ELISP desde cualquier lugar de manera segura.
Elsa agrega un poderoso sistema de tipo sobre Emacs Lisp (completamente opcional). En Can Rastle tipos y proporcionar sugerencias útiles cuando las cosas no coinciden antes de intentar ejecutar el código.
Tabla de contenido
Los lenguajes de programación dinámicos, como Emacs LISP, JavaScript y Python, tienen muchas ventajas sobre lenguajes escrita estáticamente como Java o C ++. Permiten un desarrollo y creación de prototipos más rápidos debido a su naturaleza dinámica, lo que hace que sea más fácil escribir y probar el código rápidamente.
Sin embargo, los idiomas dinámicos carecen de las características de comprobación de tipo y seguridad que proporcionan los idiomas escrita estáticamente. Esto puede conducir a errores que son difíciles de atrapar durante el desarrollo y pueden causar problemas en la producción. Al agregar un sistema de tipo encima de un lenguaje dinámico, podemos disfrutar de los beneficios de los idiomas dinámicos y estáticos.
ELSA es un sistema de tipo y analizador de EMACS LISP, cuyo objetivo es proporcionar los beneficios de un sistema de tipo al tiempo que conserva la flexibilidad y la expresividad de LISP. Es similar al tipo de mecanografiado para JavaScript o Python Tipo Sugerencias para Python, ya que proporciona una forma de agregar verificación de tipo estático a un lenguaje mecanografiado dinámicamente.
Elsa intenta ser idiomática y utilizar la mayor cantidad de información disponible posible, como las declaraciones de Edebug, los especializadores de defmetodos o los tipos de ranuras de clase EIEIO, por lo que se minimiza la cantidad de código que debe anotarse.
Actualmente estamos en una fase beta . API, el sistema de tipos y las anotaciones son bastante estables. Admitimos múltiples formas de instalar y ejecutar el analizador.
Elsa carece de muchas anotaciones de tipo para las funciones incorporadas (hay alrededor de 1500 de ellas) y variables. Por lo tanto, los resultados del análisis siguen siendo subtimales.
Las cosas aún pueden romperse en cualquier momento.
Aquí viene una lista no exhaustiva de algunas características más interesantes.
Los destacados de error en las capturas de pantalla son proporcionadas por Elsa Flycheck Extension.
Todo lo que ves aquí realmente funciona, ¡esto no es solo para el espectáculo!


















downcase puede tomar una cadena y devolver una cadena o tomar una int y devolver un int. Debido a que pasamos una variable de cadena s , podemos desambiguar qué sobrecarga de la función debe usarse y podemos derivar el tipo de retorno de la función como string en lugar de (or string int) .

Si pasamos una entrada que no coincide con ninguna sobrecarga, Elsa mostrará un informe útil de qué sobrecargas están disponibles y qué argumento no coincidió.

Elsa se puede ejecutar con Eask, Cancisco, Makem.Sh o Emake. Antes de que pueda realizar el análisis, consulte la sección de configuración sobre cómo configurar el proyecto.
ELSA Project brinda soporte para los métodos EASK, CASK y LSP. Para el soporte de Makem.SH y EMAKE, comuníquese directamente con los autores de esos paquetes.
Si usa EASK o Cancelón, puede usar las integraciones de FlyCheck y Flymake (ver más abajo).
Además, ELSA también implementa el Protocolo del servidor de idiomas (LSP) y puede usarse con el modo LSP. Esta es la mejor opción porque todo el estado está almacenado en caché en el servidor y todas las operaciones son muy rápidas. LSP también expone características de ELSA, de lo contrario no está disponible, como la finalización (a través de lsp-completion-mode ) o información contextual de tipo de ciervo.
La siguiente tabla resume las opciones:
| Característica | Orilla | Barril | makem.sh | Emake |
|---|---|---|---|---|
| Análisis independiente de CLI | ✓ | ✓ | ✓ | ✓ |
| Integración de FlyCheck | ✓ | ✓ | ⨯ | ⨯ |
| Integración de Flymake | ✓ | ⨯ | ⨯ | ⨯ |
| Protocolo del servidor de idiomas (LSP) | ✓ | ✓ | ⨯ | ⨯ |
Nota: Cuando ejecuta ELSA en un proyecto por primera vez, se recomienda iniciarlo desde la CLI porque deberá rastrear todas las dependencias que usa y guardar los resultados del análisis en los archivos de caché. Esto puede tomar un par de minutos si tiene muchas dependencias (o si incluye algo como org que atrae a otros 300 paquetes).
Después de almacenar los resultados, la próxima vez que los necesite, Elsa puede cargarlos de caché y esto generalmente es muy rápido.
Puede iniciar el LSP de inmediato, pero no responderá durante el tiempo que realiza el análisis inicial.
lint )La forma más fácil de ejecutar Elsa con EASK:
eask lint elsa [PATTERNS]
[PATTERNS] es opcional; El valor predeterminado hará todos los archivos de su paquete.
exec )Este método utiliza EASK e instala ELSA desde MelPA.
(depends-on "elsa") al archivo Eask de su proyecto.eask install-deps .eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] para analizar el archivo.exec ) Para usar la versión de desarrollo de ELSA, puede clonar el repositorio y usar la función eask link para usar el código del clon.
git clone https://github.com/emacs-elsa/Elsa.git en algún lugar de su computadora.(depends-on "elsa") al archivo Eask de su proyecto.eask link add elsa <path-to-elsa-repo> .eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] para analizar el archivo. Este método utiliza barril e instala ELSA desde MelPA.
(depends-on "elsa") para Cask el archivo de su proyecto.cask install .cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] para analizar el archivo. Para usar la versión de desarrollo de ELSA, puede clonar el repositorio y usar la función cask link para usar el código del clon.
git clone https://github.com/emacs-elsa/Elsa.git en algún lugar de su computadora.(depends-on "elsa") para Cask el archivo de su proyecto.cask link elsa <path-to-elsa-repo> .cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] para analizar el archivo. La implementación de LSP de Elsa actualmente funciona en progreso, pero el servidor es lo suficientemente estable como para que sea útil tenerlo. Hace que la pelusa sea muy rápida, porque todo el estado está almacenado en caché en la instancia del servidor y no tenemos que volver a leer todo el caché desde cero (como cuando se ejecuta a través de FlyCheck o Flymake).
Actualmente, Elsa es compatible con LSP-Mode, pero aún no está integrado en el modo LSP porque (ELSA LSP) no es lo suficientemente estable. Para usar ELSA LSP, REM (elsa-lsp-register) o Mx elsa-lsp-register para registrar el cliente con lsp-mode . Después de eso, usar Mx lsp en un búfer ELISP comenzará un espacio de trabajo.
Actualmente, estas capacidades LSP son compatibles
| Capacidad | Implementado |
|---|---|
| protagonista | Proporciona anotaciones de tipo contextual de formularios bajo punto |
| textDocumentsync | OpenClose, guardar |
| FinabryProvider |
|
Usando makem.sh , simplemente ejecute este comando desde el directorio root del proyecto, que instala y ejecuta ELSA en un sandbox temporal:
./makem.sh --sandbox lint-elsa
Para usar un directorio de sandbox no temporal llamado .sandbox y evite instalar ELSA en cada ejecución:
./makem.sh -s.sandbox --install-deps --install-linters ../makem.sh -s.sandbox lint-elsa . Consulte la documentación de makem.sh para obtener más información.
Si ya ha instalado EMAKE, ejecute make lint-elsa . Es posible que deba actualizar una versión reciente a través de EMAKE_SHA1 .
De lo contrario, instale EMAKE a través de los medios habituales:
bash <( curl -fsSL https://raw.githubusercontent.com/vermiculus/emake.el/master/new ) Este script le solicitará el nombre de su paquete y luego Bootstrap EMake. Ahora puede ejecutar los cheques de Elsa con make lint-elsa .
Si usa FlyCheck, puede usar el paquete Flycheck-Elsa que integra ELSA con FlyCheck.
Para Flymake, puedes usar Flymake-Elsa.
Por ahora, Elsa admite muy poca configuración. Para "ELSA-Enable" su proyecto, debe agregar un Elsafile.el a la raíz de su proyecto.
Elsa tiene un concepto de extensiones y conjuntos de reglas, que actualmente existen principalmente internamente y están envueltos en un gran conjunto de reglas y extensión de "predeterminado". Este sistema sigue funcionando en progreso.
Las siguientes son algunas formas en que puede extender ELSA hoy.
Una forma de extender ELSA es proporcionar reglas de análisis especiales para más formas y funciones en las que podemos explotar el conocimiento de cómo se comporta la función para reducir el análisis más.
Por ejemplo, podemos decir que si la entrada de not es t , el valor de retorno es siempre nil . Esto codifica nuestro conocimiento de dominio en forma de regla de análisis.
Todas las reglas se agregan en forma de extensiones. Elsa tiene pocas extensiones centrales para las funciones incorporadas más comunes, como la manipulación de la lista ( car , nth ...), predicados ( stringp , atomp ...), funciones lógicas ( not , ...), etc. Estos se cargan automáticamente porque las funciones son tan comunes prácticamente todos los proyectos las van a usar.
Se proporcionan extensiones adicionales para paquetes externos populares como Dash.el. Para usarlos, agregue a su Elsafile.el el formulario register-extensions , como SO
(register-extensions
dash
; ; more extensions here
) Las extensiones se cargan automáticamente cuando Elsa se encuentra con una forma requerida. Para un (require 'foo) buscará elsa-extension-foo.el e intenta cargarlo. Esto significa que en la práctica nunca tendrá que registrar extensiones para la mayoría de los paquetes de terceros.
Después de que se realice el análisis de los formularios, tenemos toda la información del tipo y la AST lista para ser procesada por varias verificaciones y reglas.
Estos pueden ser (lista no exhaustiva):
lisp-case para nombrar en lugar de snake_case .if con un progn inútil.if no siempre se evalúa como non-nil (en cuyo caso la forma if es inútil).ELSA proporciona algunos conjuntos de reglas incorporados y también se pueden usar más cargando extensiones.
Para registrar un conjunto de reglas, agregue el siguiente formulario a Elsafile.el
(register-ruleset
dead-code
style
; ; more rulesets here
)En ELISP, los usuarios no están obligados a proporcionar anotaciones de tipo a su código. Mientras que en muchos lugares se pueden inferir los tipos, hay lugares, especialmente en las funciones definidas por el usuario, donde no podemos adivinar el tipo correcto (solo podemos inferir lo que vemos durante el tiempo de ejecución).
Lea la documentación de anotaciones de tipo para obtener más información sobre cómo escribir sus propios tipos.
Abra un problema si desea trabajar en algo (no necesariamente enumerado a continuación en la hoja de ruta) para que no dupliquemos el trabajo. O simplemente danos comentarios o consejos útiles.
Puede proporcionar definiciones de tipo para las funciones integradas extendiendo elsa-typed-builtin.el . Hay mucho por ir. Algunos de los tipos necesarios para expresar lo que queremos que no existan o ser compatibles todavía, abren un problema para que podamos discutir cómo modelar las cosas.
Ver la discusión.
Después de llamar (require 'elsa-font-lock) hay una función elsa-setup-font-lock que puede llamarse desde emacs-lisp-mode-hook para configurar algunos tipos de fuentes adicionales para los tipos ELSA.
La mayor inspiración ha sido el proyecto Phpstan, que me proporcionó el ímpetu inicial para comenzar este proyecto. He pasado por sus fuentes muchas veces encontrando inspiración y elegido características.
La segunda inspiración es TypeScript, que convirtió un lenguaje bastante poco interesante en una potencia de la web (no solo).
Tomo prestado mucho de estos dos proyectos y extiendo mi gratitud y admiración.