
(Sua princesa favorita agora em Emacs!)
O ELSA é uma ferramenta que analisa seu código sem carregá -lo ou executá -lo. É 100% livre de efeitos colaterais e nos esforçamos para mantê-lo dessa maneira, para que você possa analisar qualquer código ELISP de qualquer lugar com segurança.
O ELSA adiciona um sistema de tipo poderoso sobre o EMACS LISP (completamente opcional). Os tipos podem rastrear e fornecer dicas úteis quando as coisas não correspondem antes mesmo de você tentar executar o código.
Índice
Linguagens de programação dinâmica, como EMACS LISP, JavaScript e Python, têm muitas vantagens sobre idiomas estaticamente digitados como Java ou C ++. Eles permitem desenvolvimento e prototipagem mais rápidos devido à sua natureza dinâmica, o que facilita a redação e o código de teste rapidamente.
No entanto, os idiomas dinâmicos carecem dos recursos de verificação e segurança de tipo que os idiomas tipados estaticamente fornecem. Isso pode levar a erros difíceis de capturar durante o desenvolvimento e causar problemas na produção. Ao adicionar um sistema de tipos na parte superior de uma linguagem dinâmica, podemos desfrutar dos benefícios dos idiomas dinâmicos e estáticos.
O ELSA é um sistema de tipos e analisador da EMACS LISP, que visa fornecer os benefícios de um sistema de tipo, mantendo a flexibilidade e a expressividade do LISP. É semelhante ao TypeScript para dicas de JavaScript ou Python para Python, pois fornece uma maneira de adicionar verificação do tipo estático a uma linguagem tipada dinamicamente.
A ELSA tenta ser idiomática e usar o máximo possível de informações disponíveis, como declarações de Edebug, defmethod especializantes ou tipos de slot de classe Eieio, portanto a quantidade de código que precisa ser anotada é minimizada.
Atualmente, estamos em uma fase beta . API, o sistema de tipos e as anotações são bastante estáveis. Apoiamos várias maneiras de instalar e executar o analisador.
O ELSA não possui muitas anotações de tipo para funções internas (existem cerca de 1500 delas) e variáveis. Os resultados da análise ainda são sub -ótimos.
As coisas ainda podem quebrar a qualquer momento.
Aí vem uma lista não exaustiva de alguns recursos mais interessantes.
Os destaques dos erros nas capturas de tela são fornecidos pela extensão Elsa Flycheck.
Tudo o que você vê aqui realmente funciona, isso não é apenas para mostrar!


















downcase pode pegar uma string e devolver uma string ou pegar um int e devolver um int. Como passamos uma variável de string s , podemos desambiguar qual sobrecarga da função deve ser usada e podemos derivar o tipo de retorno da função como string em vez de (or string int) .

Se passarmos uma entrada que não corresponde a nenhuma sobrecarga, o ELSA mostrará um relatório útil sobre quais sobrecargas estão disponíveis e qual argumento não corresponde.

O ELSA pode ser executado com eask, barril, makem.sh ou Emake. Antes de executar a análise, consulte a seção de configuração sobre como configurar o projeto.
O projeto ELSA fornece suporte para os métodos EASK, CASK e LSP. Para o suporte Makem.sh e Emake, entre em contato diretamente com os autores desses pacotes.
Se você usar o EASK ou o barril, poderá usar as integrações de flycheck e flymake (veja abaixo).
Além disso, o ELSA também implementa o Protocolo do Servidor de Idiomas (LSP) e pode ser usado no modo LSP. Esta é a melhor opção, porque todo o estado é armazenado em cache no servidor e todas as operações são muito rápidas. O LSP também expõe os recursos do ELSA, de outra forma não disponíveis, como conclusão (via lsp-completion-mode ) ou informações contextuais do tipo de pairar.
A tabela a seguir resume as opções:
| Recurso | Eask | Barril | makem.sh | Emake |
|---|---|---|---|---|
| Análise independente da CLI | ✓ | ✓ | ✓ | ✓ |
| Integração do flycheck | ✓ | ✓ | ⨯ | ⨯ |
| Integração do Flymake | ✓ | ⨯ | ⨯ | ⨯ |
| Protocolo de servidor de idiomas (LSP) | ✓ | ✓ | ⨯ | ⨯ |
NOTA: Quando você executa o ELSA em um projeto pela primeira vez, é recomendável iniciá -lo da CLI, pois precisará rastejar todas as dependências que você usa e salvar os resultados da análise nos arquivos de cache. Isso pode levar alguns minutos se você tiver muitas dependências (ou se você incluir algo como org , que atrai cerca de 300 outros pacotes).
Depois que os resultados são armazenados em cache, da próxima vez que você precisar deles, o ELSA pode carregá -los do cache e isso geralmente é muito rápido.
Você pode iniciar o LSP imediatamente, mas não responde durante o tempo em que está fazendo a análise inicial.
lint )A maneira mais fácil de executar o Elsa com o EASK:
eask lint elsa [PATTERNS]
[PATTERNS] é opcional; O padrão fará com que todos os seus arquivos de pacote.
exec )Este método usa o EASK e instala o ELSA da Melpa.
(depends-on "elsa") ao arquivo Eask do seu projeto.eask install-deps .eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] para analisar o arquivo.exec ) Para usar a versão de desenvolvimento do ELSA, você pode clonar o repositório e usar o recurso eask link para usar o código do clone.
git clone https://github.com/emacs-elsa/Elsa.git em algum lugar do seu computador.(depends-on "elsa") ao arquivo Eask do seu projeto.eask link add elsa <path-to-elsa-repo> .eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] para analisar o arquivo. Este método usa barris e instala o ELSA da Melpa.
(depends-on "elsa") ao arquivo Cask do seu projeto.cask install .cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] para analisar o arquivo. Para usar a versão de desenvolvimento do ELSA, você pode clonar o repositório e usar o recurso cask link para usar o código do clone.
git clone https://github.com/emacs-elsa/Elsa.git em algum lugar do seu computador.(depends-on "elsa") ao arquivo Cask do seu projeto.cask link elsa <path-to-elsa-repo> .cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] para analisar o arquivo. Atualmente, a implementação do LSP da ELSA está em andamento, mas o servidor é estável o suficiente para que seja útil tê -lo. Torna o revestimento muito rápido, porque todo o estado é armazenado em cache na instância do servidor e não precisamos reler todo o cache muito tempo do zero (como ao percorrer o flycheck ou o flymake).
Atualmente, o ELSA suporta o modo LSP, mas ainda não está embutido no modo LSP porque (ELSA LSP) não é estável o suficiente. Para usar o Elsa LSP, RUN (elsa-lsp-register) ou Mx elsa-lsp-register para registrar o cliente no lsp-mode . Depois disso, o uso Mx lsp em um buffer ELISP iniciará um espaço de trabalho.
Atualmente, esses recursos LSP são suportados
| Capacidade | Implementado |
|---|---|
| HoverProvider | Fornece anotações de tipo contextual de formulários em ponto |
| textdocumentsync | OpenClose, salve |
| conclusãoProvider |
|
Usando makem.sh , basta executar este comando do diretório raiz do projeto, que instala e executa o ELSA em uma caixa de areia temporária:
./makem.sh --sandbox lint-elsa
Para usar um diretório de sandbox não temporário chamado .sandbox e evite instalar o ELSA em cada execução:
./makem.sh -s.sandbox --install-deps --install-linters ../makem.sh -s.sandbox lint-elsa . Consulte a documentação do makem.sh para obter mais informações.
Se você já instalou o EMAKE, Run make lint-elsa . Pode ser necessário atualizar para uma versão recente via EMAKE_SHA1 .
Caso contrário, instale o EMAKE por meio dos meios usuais:
bash <( curl -fsSL https://raw.githubusercontent.com/vermiculus/emake.el/master/new ) Este script solicitará o nome do seu pacote e, em seguida, bootstrap emake. Agora você pode executar os cheques de Elsa com make lint-elsa .
Se você usar o FlyCheck, poderá usar o pacote Flycheck-Elsa, que integra o ELSA com o flycheck.
Para o Flymake, você pode usar o Flymake-Elsa.
Por enquanto, a ELSA suporta muito pouca configuração. Para "habilitar o elsa" do seu projeto, você deve adicionar um Elsafile.el à raiz do seu projeto.
A ELSA possui um conceito de extensões e conjuntos de regras, que atualmente existem principalmente internamente e são envolvidos em um grande conjunto de regras e extensão "padrão". Este sistema ainda está funcionando em andamento.
A seguir, são apresentadas algumas maneiras pelas quais você pode estender Elsa hoje.
Uma maneira de estender a ELSA é fornecer regras de análise especial para mais formas e funções, onde podemos explorar o conhecimento de como a função se comporta para restringir a análise mais.
Por exemplo, podemos dizer que, se a entrada de not for t , o valor de retorno é sempre nil . Isso codifica nosso conhecimento de domínio na forma de uma regra de análise.
Todas as regras são adicionadas na forma de extensões. O ELSA possui poucas extensões principais para as funções internas mais comuns, como manipulação da lista ( car , nth ...), predicados ( stringp , atomp ...), funções lógicas ( not , ...) e assim por diante. Eles são carregados automaticamente porque as funções são tão comuns praticamente todo projeto que as usará.
Extensões adicionais são fornecidas para pacotes externos populares, como Dash.el. Para usá register-extensions los, adicione ao seu Elsafile.el
(register-extensions
dash
; ; more extensions here
) As extensões são carregadas automaticamente quando o ELSA aparece em um formulário de requisição. Para um (require 'foo) ele procurará elsa-extension-foo.el e tentará carregá-lo. Isso significa que, na prática, você nunca precisará registrar extensões para a maioria dos pacotes de terceiros.
Após a análise dos formulários, temos todas as informações do tipo e o AST pronto para ser processado por várias verificações e regras.
Estes podem ser (lista não exaustiva):
lisp-case para nomear em vez de snake_case .if com um progn inútil.if nem sempre é avaliada para non-nil (nesse caso, o formulário if é inútil).O ELSA fornece alguns conjuntos de regras embutidos e mais também podem ser usados carregando extensões.
Para registrar um conjunto de regras, adicione o seguinte formulário a Elsafile.el
(register-ruleset
dead-code
style
; ; more rulesets here
)Nos usuários do ELISP, não precisam fornecer anotações de tipo para seu código. Enquanto em muitos lugares, os tipos podem ser inferidos, há lugares, especialmente em funções definidas pelo usuário, onde não podemos adivinhar o tipo correto (podemos apenas inferir o que vemos durante o tempo de execução).
Leia a documentação do tipo Anotações para obter mais informações sobre como escrever seus próprios tipos.
Abra um problema se você quiser trabalhar em algo (não necessariamente listado abaixo no roteiro) para que não dupliquemos o trabalho. Ou apenas nos dê feedback ou dicas úteis.
Você pode fornecer definições de tipo para funções internas, estendendo-se elsa-typed-builtin.el . Há muito o que ir. Alguns dos tipos necessários para expressar o que queremos podem não existir ou ainda ser suportados, abrem um problema para que possamos discutir como modelar as coisas.
Veja a discussão.
Após a chamada (require 'elsa-font-lock) existe uma função elsa-setup-font-lock que pode ser chamado do emacs-lisp-mode-hook para configurar alguns bloqueios de fonte adicionais para os tipos de ELSA.
A maior inspiração foi o projeto Phpstan, que me proporcionou o impulso inicial para iniciar este projeto. Eu já passei por suas fontes muitas vezes encontrando inspiração e escolhendo recursos.
A segunda inspiração é o TypeScript, que transformou uma linguagem bastante desinteressante em uma potência da Web (não apenas).
Pego emprestado fortemente esses dois projetos e estendo minha gratidão e admiração.