
(Putri favorit Anda sekarang di Emacs!)
ELSA adalah alat yang menganalisis kode Anda tanpa memuat atau menjalankannya. Ini 100% gratis efek samping dan kami berusaha untuk tetap seperti itu, sehingga Anda dapat menganalisis kode ELISP dari mana saja dengan aman.
ELSA menambahkan sistem tipe yang kuat di atas Emacs Lisp (sepenuhnya opsional). Dalam dapat melacak jenis dan memberikan petunjuk yang bermanfaat ketika hal -hal tidak cocok sebelum Anda bahkan mencoba menjalankan kode.
Daftar isi
Bahasa pemrograman yang dinamis, seperti Emacs Lisp, JavaScript dan Python, memiliki banyak keunggulan dibandingkan bahasa yang diketik secara statis seperti Java atau C ++. Mereka memungkinkan pengembangan dan pembuatan prototipe yang lebih cepat karena sifatnya yang dinamis, yang membuatnya lebih mudah untuk menulis dan menguji kode dengan cepat.
Namun, bahasa dinamis tidak memiliki fitur pemeriksaan dan keselamatan jenis yang disediakan oleh bahasa yang diketik secara statis. Hal ini dapat menyebabkan kesalahan yang sulit ditangkap selama pengembangan dan dapat menyebabkan masalah dalam produksi. Dengan menambahkan sistem tipe di atas bahasa yang dinamis, kita dapat menikmati manfaat dari kedua bahasa yang dinamis dan statis.
ELSA adalah sistem tipe dan penganalisa untuk EMACS LISP, yang bertujuan untuk memberikan manfaat dari sistem jenis sambil mempertahankan fleksibilitas dan ekspresi LISP. Ini mirip dengan naskah untuk JavaScript atau petunjuk tipe Python untuk python karena menyediakan cara untuk menambahkan jenis pemeriksaan statis ke bahasa yang diketik secara dinamis.
ELSA mencoba menjadi idiomatik dan menggunakan sebanyak mungkin informasi yang tersedia, seperti Deklarasi Edebug, Specializer DefMethod atau jenis slot kelas EIEIO, sehingga jumlah kode yang perlu dijelaskan diminimalkan.
Kami saat ini dalam fase beta . API, sistem jenis dan anotasi cukup stabil. Kami mendukung banyak cara untuk menginstal dan menjalankan penganalisa.
Elsa tidak memiliki banyak anotasi jenis untuk fungsi bawaan (ada sekitar 1500 di antaranya) dan variabel. Hasil analisis karenanya masih sub optimal.
Segalanya mungkin masih pecah di titik mana pun.
Inilah daftar yang tidak lengkap dari beberapa fitur yang lebih menarik.
Sorotan kesalahan dalam tangkapan layar disediakan oleh ELSA Flycheck Extension.
Semua yang Anda lihat di sini benar -benar berfungsi, ini bukan hanya untuk pertunjukan!


















downcase dapat mengambil string dan mengembalikan string atau mengambil int dan mengembalikan int. Karena kami melewati variabel string s , kami dapat menghilangkan kelebihan fungsi yang harus digunakan dan kami dapat memperoleh jenis pengembalian fungsi sebagai string alih -alih (or string int) .

Jika kami memberikan input yang tidak cocok dengan kelebihan beban, ELSA akan menunjukkan laporan bermanfaat tentang kelebihan apa yang tersedia dan argumen apa yang tidak cocok.

Elsa dapat dijalankan dengan EASK, CASK, MAKEM.SH atau EMAKE. Sebelum Anda dapat melakukan analisis, lihat bagian konfigurasi tentang cara mengkonfigurasi proyek.
Proyek ELSA memberikan dukungan untuk metode EASK, CASK dan LSP. Untuk dukungan Makem.sh dan emake, hubungi penulis paket tersebut secara langsung.
Jika Anda menggunakan EASK atau CASK, Anda dapat menggunakan Integrasi Flycheck dan FlyMake (lihat di bawah).
Selain itu, ELSA juga mengimplementasikan Protokol Server Bahasa (LSP) dan dapat digunakan dengan mode LSP. Ini adalah pilihan terbaik karena semua negara di -cache di server dan semua operasi sangat cepat. LSP juga memperlihatkan fitur ELSA jika tidak tersedia, seperti penyelesaian (melalui lsp-completion-mode ) atau informasi jenis hover kontekstual.
Tabel berikut merangkum opsi:
| Fitur | Eask | Tong kecil | Makem.sh | Emake |
|---|---|---|---|---|
| Analisis yang berdiri sendiri dari CLI | ✓ | ✓ | ✓ | ✓ |
| Integrasi Flycheck | ✓ | ✓ | ⨯ | ⨯ |
| Integrasi flymake | ✓ | ⨯ | ⨯ | ⨯ |
| Protokol Server Bahasa (LSP) | ✓ | ✓ | ⨯ | ⨯ |
Catatan: Ketika Anda menjalankan ELSA dalam proyek untuk pertama kalinya, disarankan untuk memulainya dari CLI karena perlu merangkak semua dependensi yang Anda gunakan dan menyimpan hasil analisis ke file cache. Ini bisa memakan waktu beberapa menit jika Anda memiliki banyak dependensi (atau jika Anda memasukkan sesuatu seperti org yang menarik sekitar 300 paket lainnya).
Setelah hasilnya di -cache, lain kali Anda membutuhkannya, ELSA dapat memuatnya dari cache dan ini umumnya sangat cepat.
Anda dapat segera memulai LSP tetapi tidak responsif selama ia melakukan analisis awal.
lint )Cara termudah untuk mengeksekusi ELSA dengan EASK:
eask lint elsa [PATTERNS]
[PATTERNS] adalah opsional; Default akan meletakkan semua file paket Anda.
exec )Metode ini menggunakan EASK dan menginstal ELSA dari Melpa.
(depends-on "elsa") ke file Eask proyek Anda.eask install-deps .eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] untuk menganalisis file.exec ) Untuk menggunakan versi pengembangan ELSA, Anda dapat mengkloning repositori dan menggunakan fitur eask link untuk menggunakan kode dari klon.
git clone https://github.com/emacs-elsa/Elsa.git di suatu tempat ke komputer Anda.(depends-on "elsa") ke file Eask proyek Anda.eask link add elsa <path-to-elsa-repo> .eask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] untuk menganalisis file. Metode ini menggunakan tong dan memasang ELSA dari Melpa.
(depends-on "elsa") ke Cask file proyek Anda.cask install .cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] untuk menganalisis file. Untuk menggunakan versi pengembangan ELSA, Anda dapat mengkloning repositori dan menggunakan fitur cask link untuk menggunakan kode dari klon.
git clone https://github.com/emacs-elsa/Elsa.git di suatu tempat ke komputer Anda.(depends-on "elsa") ke Cask file proyek Anda.cask link elsa <path-to-elsa-repo> .cask exec elsa FILE-TO-ANALYSE [ANOTHER-FILE...] untuk menganalisis file. Implementasi LSP ELSA sedang dalam proses, tetapi server cukup stabil sehingga berguna untuk memilikinya. Itu membuat serat sangat cepat, karena semua negara di-cache dalam instance server dan kami tidak perlu membaca kembali seluruh cache sangat waktu dari awal (seperti saat berlari melalui Flycheck atau Flymake).
ELSA saat ini mendukung mode LSP, tetapi belum bawaan untuk mode LSP itu sendiri karena IT (ELSA LSP) tidak cukup stabil. Untuk menggunakan ELSA LSP, jalankan (elsa-lsp-register) atau Mx elsa-lsp-register untuk mendaftarkan klien dengan lsp-mode . Setelah itu, menggunakan Mx lsp dalam buffer ELISP akan memulai ruang kerja.
Saat ini, kemampuan LSP ini didukung
| Kemampuan | Diterapkan |
|---|---|
| HoverProvider | Memberikan anotasi tipe kontekstual dari formulir di bawah titik |
| TextDocumentsync | OpenClose, simpan |
| Penyelidikan Penyelesaian |
|
Menggunakan makem.sh , cukup jalankan perintah ini dari direktori proyek root, yang menginstal dan menjalankan ELSA di kotak pasir sementara:
./makem.sh --sandbox lint-elsa
Untuk menggunakan direktori kotak pasir non-temporer bernama .sandbox dan hindari menginstal ELSA pada setiap proses:
./makem.sh -s.sandbox --install-deps --install-linters ../makem.sh -s.sandbox lint-elsa . Lihat dokumentasi makem.sh untuk informasi lebih lanjut.
Jika Anda sudah menginstal EMAKE, jalankan make lint-elsa . Anda mungkin perlu memperbarui ke versi terbaru melalui EMAKE_SHA1 .
Kalau tidak, instal emake melalui cara biasa:
bash <( curl -fsSL https://raw.githubusercontent.com/vermiculus/emake.el/master/new ) Skrip ini akan meminta Anda untuk nama paket Anda dan kemudian bootstrap emake. Anda sekarang dapat menjalankan cek Elsa dengan make lint-elsa .
Jika Anda menggunakan Flycheck, Anda dapat menggunakan paket Flycheck-Elsa yang mengintegrasikan Elsa dengan Flycheck.
Untuk FlyMake, Anda dapat menggunakan FlyMake-Essa.
Untuk saat ini ELSA mendukung konfigurasi yang sangat sedikit. Untuk "Elsa-Enable" proyek Anda, Anda harus menambahkan Elsafile.el ke akar proyek Anda.
ELSA memiliki konsep ekstensi dan aturan, yang saat ini ada sebagian besar secara internal dan dibungkus dalam satu aturan dan ekstensi "default" besar. Sistem ini masih dalam proses.
Berikut ini adalah beberapa cara Anda dapat memperpanjang ELSA hari ini.
Salah satu cara untuk memperluas ELSA adalah dengan memberikan aturan analisis khusus untuk lebih banyak bentuk dan fungsi di mana kita dapat mengeksploitasi pengetahuan tentang bagaimana fungsi berperilaku lebih mempersempit analisis.
Misalnya, kita dapat mengatakan bahwa jika input not adalah t , nilai pengembalian selalu nil . Ini mengkode pengetahuan domain kita dalam bentuk aturan analisis.
Semua aturan ditambahkan dalam bentuk ekstensi. ELSA memiliki beberapa ekstensi inti untuk fungsi bawaan yang paling umum seperti manipulasi daftar ( car , nth ...), predikat ( stringp , atomp ...), fungsi logis ( not , ...) dan sebagainya. Ini secara otomatis dimuat karena fungsinya sangat umum hampir setiap proyek akan menggunakannya.
Ekstensi tambahan disediakan untuk paket eksternal populer seperti dash.el. Untuk menggunakannya, tambahkan ke Elsafile.el Anda register-extensions
(register-extensions
dash
; ; more extensions here
) Ekstensi dimuat secara otomatis ketika ELSA datang pada formulir yang membutuhkan. Untuk (require 'foo) itu akan mencari elsa-extension-foo.el dan mencoba memuatnya. Ini berarti bahwa dalam praktiknya Anda tidak akan pernah harus mendaftarkan ekstensi untuk sebagian besar paket pihak ke -3.
Setelah analisis formulir selesai, kami memiliki semua informasi jenis dan AST yang siap diproses lebih lanjut oleh berbagai cek dan aturan.
Ini bisa (daftar tidak lengkap):
lisp-case untuk penamaan alih-alih snake_case .if dengan progn yang tidak berguna.if tidak selalu mengevaluasi ke non-nil (dalam hal ini formulir if tidak berguna).ELSA menyediakan beberapa aturan bawaan dan lebih banyak lagi juga dapat digunakan dengan memuat ekstensi.
Untuk mendaftarkan aturan, tambahkan formulir berikut ke Elsafile.el
(register-ruleset
dead-code
style
; ; more rulesets here
)Di ELISP pengguna tidak diharuskan memberikan anotasi jenis ke kode mereka. Sementara di banyak tempat jenis dapat disimpulkan ada tempat, terutama dalam fungsi yang ditentukan pengguna, di mana kita tidak bisa menebak jenis yang benar (kita hanya dapat menyimpulkan apa yang kita lihat selama runtime).
Baca Dokumentasi Anotasi Jenis untuk informasi lebih lanjut tentang cara menulis tipe Anda sendiri.
Buka masalah jika Anda ingin mengerjakan sesuatu (tidak harus tercantum di bawah ini dalam peta jalan) sehingga kami tidak akan menggandakan pekerjaan. Atau beri kami umpan balik atau tips yang bermanfaat.
Anda dapat memberikan definisi jenis untuk fungsi bawaan dengan memperluas elsa-typed-builtin.el . Ada banyak hal yang harus dilakukan. Beberapa jenis yang diperlukan untuk mengekspresikan apa yang kita inginkan mungkin belum ada atau didukung, membuka masalah sehingga kita dapat membahas bagaimana memodelkan sesuatu.
Lihat diskusi.
Setelah menelepon (require 'elsa-font-lock) ada fungsi elsa-setup-font-lock yang dapat dipanggil dari emacs-lisp-mode-hook untuk mengatur beberapa penguncian font tambahan untuk jenis ELSA.
Inspirasi terbesar adalah proyek PhPStan, yang memberi saya dorongan awal untuk memulai proyek ini. Saya telah melalui sumber mereka berkali -kali menemukan inspirasi dan memilih fitur.
Inspirasi kedua adalah TypeScript, yang mengubah bahasa yang agak tidak menarik menjadi pembangkit tenaga listrik (tidak hanya).
Saya sangat meminjam dari kedua proyek ini dan menyampaikan rasa terima kasih dan kekaguman saya.