deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (native)

Sift, Scheme, Emacs Lisp ve Common Lisp için ortak formatter, linter ve language server getiriyor

Sift adlı yeni bir MIT lisanslı araç, Scheme, Emacs Lisp ve Common Lisp için idempotent biçimlendirme, 92 kural içeren bir linter ve bir Language Server Protocol uygulaması sunuyor.

Sift, Scheme, Emacs Lisp ve Common Lisp için ortak formatter, linter ve language server getiriyor

Tek araç, üç lehçe

Sift adlı bir proje, Lisp ailesi için iddialı bir öneriyle Hacker News'in ana sayfasına ulaştı: Scheme, Emacs Lisp ve Common Lisp olmak üzere üç lehçeyi biçimlendiren, lint'leyen ve servis eden tek bir program. Projenin GitHub sayfasına göre Sift, yalnızca standart kütüphanesini kullanarak Guile 3.0 ile yazılmış; C bağımlılığı yok ve derleme adımı yok. Guix veya Nix üzerinden ya da deponun düz bir kopyasıyla kuruluyor ve MIT lisansıyla tek bir çalıştırılabilir dosya artı bir Emacs paketi olarak geliyor.

README'nin deyimiyle, geri kalan her şeyi taşıyan tasarım kararı şudur: bir Lisp dosyası, satır dizisi değil, kaynak konumları eklenmiş bir form ağacıdır. Sift bu ağacı ayrıştırır ve geri yazdırır; biçimlendirmenin neyi değiştirip neyi değiştirmeyeceği konusunda kesin garantiler verebilmesini sağlayan da budur.

Formatter garantileri

Test paketinde her fixture üzerinde iki özellik savunulur. Birincisi idempotenstir: formatter'ı zaten biçimlendirilmiş bir dosyanın üzerinden çalıştırmak dosyayı değiştirmeden döner. İkincisi korunmadır — yorumlar, boş satırlar, #; ile yazılan datum yorumları, #. ile yazılan read-time formları ve benzeri zor yapılar, girdikleri yerden bayt bayt aynı şekilde çıkar.

Her lehçe, uzlaştırılmış bir gramer yerine kendi kurallarıyla ayrıştırılır. README somut bir örnek verir: köşeli parantezler Emacs Lisp'te bir vektörü, Scheme'de ise bir clause'ı gösterir ve Sift ortayı bulmak yerine her lehçenin kendi belirtimini izler. #{ ... }# sembolleri gibi Guile'e özgü reader sözdizimi de ele alınır, çünkü Guile aracın kendisinin yazıldığı lehçedir; diğer iki lehçe kendi belirtimlerinden okunur.

Kontrol et, biçimlendir, lint'le, düzelt

Araç işlerini ayrı komutlara böler. sift check uygulayacağı yamayı yazdırır ve 1 durum koduyla çıkar; bu da onu bir CI kapısı olarak kullanılabilir kılar. sift format biçimlendirilmiş dosyayı yazdırır, --write eklenince kaydeder. sift lint tetiklenen kuralın adını, önem derecesini ve konumunu belirtir; lint --fix ise onarımları uygular. sift ci komutu, ağaca dokunmadan biçimlendirme ve lint sorularını tek geçişte yanıtlar.

Linter 92 kuralla gelir. Her kuralın bir adı, SIFT012 gibi kararlı bir kodu, bir gerekçesi, geçerli olduğu lehçeler, bir örneği ve kendi test dosyası vardır. sift explain bir kuralın gerekçesini programın kendisinden okur ve kurallar belgeleri aynı kayıtlardan üretilir; böylece belgeler tanımladıkları koddan kopamaz. Düzeltmeler bilinçli olarak muhafazakârdır: bir düzeltme tam olarak bir aralığı değiştirir, hiçbir sınırlayıcı uydurulmaz ve hiçbir tanımlayıcı yeniden adlandırılmaz; bir çalıştırmanın birleşik düzeltmeleri ayrıştırma hatası yaratacaksa hepsi atılır. Bastırma, kod incelemesinin asla ulaşmadığı bir yapılandırma listesinde değil, kodun yanındaki yorumlarda yaşar — bir kuralı tek bir satır için, kapsayan form için devre dışı bırakmak ya da yeniden açmak.

Bir language server ve makine tarafından okunabilir çıktı

Aynı program, Language Server Protocol'ü standart girdi ve çıktı üzerinden konuşur; böylece Emacs'teki Eglot, Neovim ve diğer herhangi bir LSP istemcisi, bir komut satırı hattının aldığı bulguları ve düzeltmeleri alır. Teşhis ve biçimlendirmenin ötesinde sunucu, tanıma gitme ve referanslar sunar — standart kütüphane ve kurulu paketler tarafından tanımlanan adlar, bir uygulamanın derlemesine dahil ettiği belgeler ve çoğu Emacs kurulumunun taşıdığı sıkıştırılmış kaynaklar dahil — artı bir ana hat, tamamlama, bir çağrının argümanlarını adlandıran inlay hint'ler, semboller ve kurallar için hover, import düzenleme, modülü ayak uydurarak tutan dosya yeniden adlandırmaları ve bir buffer kaydedildiğinde lehçenin kendi derleyicisinden ikinci bir görüş.

Hatlar için çıktı, Emacs compilation modunun ayrıştırdığı derleme tarzı bir satır, JSON, SARIF 2.1.0, GitHub pull request ek notları ya da yalnızca çıkış kodunu kontrol eden betikler için sessizlik olabilir. Yapılandırma, sistemden komut satırına dört katman halinde YAML'da yaşar ve sift config hangi katmanın kazandığını bildirir. sift install-hooks CI kontrolünü çalıştıran bir pre-commit hook yazar ve sift doctor yorumlayıcıyı, kütüphaneyi, kural sayısını ve etkin yapılandırmayı raporlar.

Neden önemli

Ana akım diller formatter, linter ve language server'ları olmazsa olmaz olarak görürken, Lisp ailesi uzun süredir parça parça, lehçe başına çözümlere bel bağladı. Sift'in bahsi, Lisp kodunun metinden önce bir veri yapısı olduğu gerçeğine dayanan tek bir kesin formatter-linter-server'ın; öğrencilere, Emacs paketi yazarlarına, Guix katkıcılarına ve çok dilli depolara tek bir çalıştırılabilir dosya, tek bir yapılandırma dosyası ve tek bir CI adımıyla hizmet edebileceğidir. Test paketi boyunca savunulan koruma ve idempotens garantileri, otomatik formatter'lar hakkındaki en yaygın şikâyeti — yorumları bozmaları ve diff'leri karıştırmaları — hedefliyor. Benimsenme açık bir soru, ama MIT lisansı ve derlemesiz Guile uygulaması, denemek isteyenler için eşiği düşürüyor.

  • #lisp
  • #scheme
  • #emacs-lisp
  • #language-server-protocol
  • #developer-tools
  • #open-source

İlgili yazılar