
(Ваша любимая принцесса сейчас в Emacs!)
ELSA - это инструмент, который анализирует ваш код без загрузки или его запуска. Это на 100% без побочных эффектов, и мы стремимся сохранить его таким образом, поэтому вы можете безопасно проанализировать любой код ELISP из любого места.
ELSA добавляет мощную систему типа поверх EMACS LISP (совершенно необязательно). В том, чтобы отслеживать типы и предоставить полезные подсказки, когда все не совпадает, прежде чем вы даже попытаетесь запустить код.
Оглавление
Динамические языки программирования, такие как EMACS LISP, JavaScript и Python, имеют много преимуществ по сравнению с статически напечатанными языками, такими как Java или C ++. Они допускают более быструю разработку и прототипирование из -за своего динамического характера, что облегчает быстро писать и тестировать код.
Тем не менее, динамические языки не имеют функций проверки типа и безопасности, которые обеспечивают статически напечатанные языки. Это может привести к ошибкам, которые трудно поймать во время разработки и могут вызвать проблемы в производстве. Добавляя систему типа поверх динамического языка, мы можем пользоваться преимуществами как динамических, так и статических языков.
ELSA является типовой системой и анализатором EMACS LISP, целью которого является обеспечение преимуществ системы типа при сохранении гибкости и выразительности LISP. Он похож на TypeScript для подсказок типа JavaScript или Python для Python в том, что он обеспечивает способ добавить проверку статического типа к динамически напечатанному языку.
ELSA пытается быть идиоматическим и использовать как можно больше доступной информации, такую как объявления EdeBug, специализаторы DefMethod или типы слотов класса EIEIO, поэтому количество кода, которое необходимо аннотировать, минимизируется.
В настоящее время мы находимся в бета -фазе. API, типовая система и аннотации довольно стабильны. Мы поддерживаем несколько способов установки и запуска анализатора.
ELSA не хватает множества типовых аннотаций для встроенных функций (их около 1500) и переменных. Поэтому результаты анализа по -прежнему являются суб -оптимальными.
Вещи могут все еще сломаться в любой момент.
Здесь приходит неэкгартный список некоторых более интересных функций.
Основные мощности на скриншотах предоставляются расширением Elsa Flycheck.
Все, что вы видите здесь, на самом деле работает, это не только для шоу!


















downcase может взять строку, вернуть строку или взять Int и вернуть Int. Поскольку мы передаем строковую переменную s , мы можем устранение устранения, какая перегрузка функции должна использоваться, и мы можем получить возвратный тип функции как string вместо (or string int) .

Если мы передаем ввод, который не соответствует перегрузке, ELSA покажет полезный отчет о том, какие перегрузки доступны и какой аргумент не совпадает.

Эльза может управляться с Eask, Cosk, Makem.sh или Emake. Прежде чем вы сможете выполнить анализ, см. Раздел «Конфигурация» о том, как настроить проект.
Проект ELSA обеспечивает поддержку методов EASK, COSC и LSP. Для поддержки Makem.sh и Emake обратитесь к авторам этих пакетов напрямую.
Если вы используете EASK или COCK, вы можете использовать интеграции Flycheck и Flymake (см. Ниже).
Кроме того, ELSA также реализует протокол языкового сервера (LSP) и может использоваться с LSP-режимом. Это лучший вариант, потому что все состояние кэшируется на сервере, и все операции очень быстрые. LSP также раскрывает функции ELSA, в противном случае недоступные, такие как завершение (через lsp-completion-mode ) или информация о контекстном типе.
В следующей таблице приведены варианты:
| Особенность | Ведущий | Бочка | makem.sh | Эмик |
|---|---|---|---|---|
| Автономный анализ из CLI | ✓ | ✓ | ✓ | ✓ |
| Интеграция Flycheck | ✓ | ✓ | ⨯ | ⨯ |
| Интеграция Flymake | ✓ | ⨯ | ⨯ | ⨯ |
| Протокол языкового сервера (LSP) | ✓ | ✓ | ⨯ | ⨯ |
ПРИМЕЧАНИЕ. Когда вы запускаете ELSA в проекте в первый раз, рекомендуется запустить его с CLI, потому что ей необходимо будет ползти все зависимости, которые вы используете, и сохранить результаты анализа в файлах кэша. Это может занять пару минут, если у вас есть много зависимостей (или если вы включаете что -то вроде org , которое приносит около 300 других пакетов).
После того, как результаты будут кэшированы, в следующий раз, когда вам понадобится, что Эльза может загрузить их из кеша, и это, как правило, очень быстро.
Вы можете сразу запустить LSP, но он будет не отвечать в то время, когда он проводит первоначальный анализ.
lint )Самый простой способ казнить Эльзу с EASK:
eask lint elsa [PATTERNS]
[PATTERNS] обязательно; По умолчанию все ваши файлы пакетов прибудут.
exec )Этот метод использует EASK и устанавливает ELSA из MELPA.
(depends-on "elsa") в файл Eask вашего проекта.eask install-deps .eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] для анализа файла.exec ) Чтобы использовать версию разработки ELSA, вы можете клонировать репозиторий и использовать функцию eask link для использования кода из клона.
git clone https://github.com/emacs-elsa/Elsa.git где-то на вашем компьютере.(depends-on "elsa") в файл Eask вашего проекта.eask link add elsa <path-to-elsa-repo> .eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] для анализа файла. В этом методе используется бочка и устанавливает ELSA из MELPA.
(depends-on "elsa") в Cask File вашего проекта.cask install .cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] для анализа файла. Чтобы использовать версию разработки ELSA, вы можете клонировать репозиторий и использовать функцию cask link для использования кода из клона.
git clone https://github.com/emacs-elsa/Elsa.git где-то на вашем компьютере.(depends-on "elsa") в Cask File вашего проекта.cask link elsa <path-to-elsa-repo> .cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] для анализа файла. Реализация LSP в ELSA в настоящее время работает в процессе работы, но сервер достаточно стабилен, чтобы он был полезен. Это делает снятие очень быстро, потому что все состояние кэшируется в экземпляре сервера, и нам не нужно перечитывать весь кэш очень время с нуля (например, при работе через Flycheck или Flymake).
ELSA в настоящее время поддерживает LSP-режим, но она еще не встроена для самого LSP-режима, потому что он (ELSA LSP) недостаточно стабилен. Чтобы использовать ELSA LSP, запустите (elsa-lsp-register) или Mx elsa-lsp-register , чтобы зарегистрировать клиент с помощью lsp-mode . После этого использование Mx lsp в буфере Elisp запустит рабочую область.
В настоящее время эти возможности LSP поддерживаются
| Способность | Реализовано |
|---|---|
| Hoverprovider | Предоставляет аннотации контекстуального типа форм под пунктом |
| TextDocumentsync | OpenClose, Save |
| Завершение прова |
|
Используя makem.sh , просто запустите эту команду из каталога Project Root, который устанавливает и запускает 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. Теперь вы можете запустить чеки Elsa с make lint-elsa .
Если вы используете Flycheck, вы можете использовать пакет Flycheck-Elsa, который интегрирует ELSA с Flycheck.
Для Flymake вы можете использовать Flymake-Elsa.
На данный момент ELSA поддерживает очень небольшую конфигурацию. Чтобы «Elsa-Enable» ваш проект, вы должны добавить Elsafile.el в корень вашего проекта.
У ELSA есть концепция расширений и наборов правил, которая в настоящее время существует в основном внутри и обернута одним большим набором правил и расширением правил «по умолчанию». Эта система все еще работает в процессе.
Ниже приведены некоторые способы расширить ELSA сегодня.
Одним из способов расширения ELSA является предоставление специальных правил анализа для большего количества форм и функций, в которых мы можем использовать знание того, как функция ведет, чтобы больше сузить анализ.
Например, мы можем сказать, что если вход not IS T IS t , возвращаемое значение всегда равна nil . Это кодирует наше доменное знание в форме правила анализа.
Все правила добавляются в форме расширений. ELSA имеет мало основных расширений для наиболее распространенных встроенных функций, таких как манипуляции с списками ( car , nth ...), предикаты ( stringp , atomp ...), логические функции ( not , ...) и так далее. Они автоматически загружаются, потому что функции настолько распространены практически каждый проект, который будет использовать их.
Дополнительные расширения предоставляются для популярных внешних пакетов, таких как Dash.el. Чтобы использовать их, добавьте в свою форму Elsafile.el в форму register-extensions , например, так
(register-extensions
dash
; ; more extensions here
) Расширения автоматически загружаются, когда ELSA сталкивается с формой потребности. Для (require 'foo) он будет искать elsa-extension-foo.el и пытается загрузить его. Это означает, что на практике вам никогда не придется регистрировать расширения для большинства сторонних пакетов.
После анализа форм у нас есть вся информация типа и AST, готовые к дальнейшей обработке с помощью различных проверок и правил.
Это могут быть (неэкгартный список):
lisp-case для именования вместо snake_case .if с бесполезным progn .if не всегда оценивается в non-nil (в этом случае форма if форма бесполезно).ELSA предоставляет некоторые встроенные наборы правил, и больше можно использовать путем нагрузки расширений.
Чтобы зарегистрировать набор правил, добавьте следующую форму в Elsafile.el
(register-ruleset
dead-code
style
; ; more rulesets here
)В ELISP пользователи не обязаны предоставлять аннотации типа своему коду. В то время как во многих местах типы можно вывести, есть места, особенно в определенных пользователях функциях, где мы не можем догадаться правильным типом (мы можем сделать вывод только то, что видим во время выполнения).
Прочитайте документацию по аннотациям типа для получения дополнительной информации о том, как написать свои собственные типы.
Откройте проблему, если вы хотите поработать над чем -то (не обязательно перечисленным ниже в дорожной карте), чтобы мы не продублируем работу. Или просто дайте нам отзывы или полезные советы.
Вы можете предоставить определения типа для встроенных функций, расширяя elsa-typed-builtin.el . Есть что пойти. Некоторые из типов, необходимых для выражения того, что мы хотим, могут не существовать или поддерживать, открыть проблему, чтобы мы могли обсудить, как моделировать вещи.
Смотрите обсуждение.
После вызова (require 'elsa-font-lock) существует функция elsa-setup-font-lock , которая может быть вызвана из emacs-lisp-mode-hook чтобы настроить некоторую дополнительную блокировку шрифтов для типов ELSA.
Самым большим вдохновением был проект PHPSTAN, который дал мне первоначальный импульс для начала этого проекта. Я много раз проходил их источники, обнаруживая вдохновение и выбирая функции.
Второе вдохновение - TypeScript, который превратил довольно неинтересный язык в электростанцию (не только) веб -сайта.
Я заимствую в значительной степени у обоих этих проектов и выражаю свою благодарность и восхищение.