Elisp neden ad alanlarına sahip değil?


40

S: Elisp neden isim alanlarına sahip değil ve bunları nasıl alabiliriz?

Elisp, tüm global fonksiyonların, değişkenlerin ve sabitlerin önekini benzersiz bir önekle ön kodlama kuralına götüren global olandan başka isim alanlarına sahip değildir.

Sıkıntı faktörünün yanı sıra, verilen 1) sürekli artan büyük kitaplık ve paket sayısı ve 2) ya ön ek sözleşmeye uymayan eski işlevlerin ve değişkenlerin devam eden mevcudiyeti; Gerçekten kullanabilecekleri gerçekten iyi bir önek seçeneği olmadığı konusunda kendi kendine yetiyorlar. Ayrıca, eski kodu rasyonelleştirmek için yapılan periyodik girişimlerin (' clden geçişe olduğu gibi cl-lib) önemsiz miktarda bir çalışma olduğu anlamına gelir. (Temizlikten memnun olduğum halde, her ne zaman bir şeyler yazsam hala gözyaşı döküyorum cl-find).

Elisp'in neden birkaç on yıllık kullanımdan sonra hala ad alanlarının bulunmadığını öğrenip öğrenemediğimi görmek için uğraştım, ancak mütevazı hasatta biraz şaşırdım. Ad alanlarını wiki sayfası oldukça kısadır. Nic Ferrier konuyla ilgili biraz daha uzun bir tedavi görüyor ve emacs-devel hakkında da oldukça yeni bir konu var . Bir var eski yığın taşması parçacığı ad alanlarını uygulamak için makro kullanılma olasılığını tartışmaktadır 2010 den; makro yaklaşımın bir başka örneği burada bulunabilir . Uygulamaları (bir çift en azından var burada ve burada ikinci bir açıklama ile, burada) dışarıda, ama birkaç yıldır çok fazla aktivite görmediler ve ben onları kullanan herhangi bir kütüphaneye rastlamadım.

Ad alanları eklemek kolay olsaydı çoktan yapıldığını farz ediyorum. Yani:

  • Elisp'e isim alanları eklemenin teknik engelleri nelerdir?
  • Ad alanları eklemek mevcut kodu çok bozuyor mu?
  • Bu işlevsellik, elde edilmesi için organik olması gereken bir şey mi (tercümanın kendisinde değişir), yoksa gerçekten makrolar üzerinden oluşturulabilir mi?

6
Şuna bir göz atabilirsiniz: github.com/Bruce-Connor/names Otomatik ad alanlarının geriye dönük olarak uyumlu (mevcut adları ayırma manuel yöntemiyle) olduğu anlaşılıyor. (Ve ben% 99 eminim başka bir kütüphane gördüm, geliştiricinin bazı emacs bloglarında son zamanlarda bahsettiğim ad alanlarını içeren bir fonksiyon alt kümesini dışa aktarmasına izin verdim, ancak geri bulamadım).
T. Verron

2
İkincisi, yukarıdaki bağlantıya bir göz atmalısın. Çok yeni (geçen ay yayımlanan) ve çok sağlam bir ad alanı makrosu. Hala edebug gibi araçlarla uyumluluk konusunda birkaç sapıklık yapıyorum ama paket çalışıyor. Sorunuza cevap vermek gerçekten çok uzun bir deneme (karşılaştığım teknik engeller çoktu) ancak önümüzdeki haftalarda blog yazılarına yazmaya çalışacağım.
Malabarba

1
Sanırım ad alanları farklı şeyler ifade ediyor. Emacs'in birkaç isim alanına sahip olduğunu söylerdim: Biri değişkenler, biri fonksiyonlar ve makrolar, diğeri yüzler ve temalar için ve…
Harald Hanche-Olsen

1
@ HaraldHanche-Olsen kesinlikle bunu söyleyebilirim. Bu bağlamda neden paket başına isim alanı olmadığını soruyor.
Malabarba

Yanıtlar:


28

Neden isim alanı yok?

Çünkü bu karmaşık ve hiç kimse henüz tam daldırmaya yetecek kadar acil olduğunu düşünmedi. Bu, daha önce dev listesinde tartışıldı (bir kereden fazla) ve gitme hareketinden sonra bunu düzeltmek için sözler verildi.

Bu arada, kendime ait bir çözüm yazdım (seçenek listesi için aşağıya bakın).

Teknik engeller nelerdir?

Kapının hemen dışında, 3 büyük engeliniz var; bu, üstesinden gelmeniz gereken, ad alanlarının güncel bir Emacs üzerinde çalışma şansı olsa bile:

  • Sembollerin iç içe geçme şeklini değiştirmeniz gerekir (bu kolay kısımdır).
  • Bayt-derleyici ad alanlarını anlamalıdır.
  • Kullanılan otomatik yük oluşturma, package.elad alanlarını anlamalıdır.

Birlikte çalışmak için bu 3 şeyi yamalamak, ancak ad alanlarını uygulamak için geldiğiniz önemsiz değildir. Yalnızca en yeni Emacs sürümüne adanmışsanız kesinlikle yapılabilir. Önceki sürümleri de destekleyen bir paket yazmak istiyorsanız (24 ailenin tümü gibi), bu zorlu bir mücadeleye dönüşür.

Bunun ötesinde, isteğe bağlı başka engeller de var. Elisp senin yüzünden ve mevcut araçları tüm gücün büyük ALL ad ile çalışmalarına yamalı gerekecektir Bunlardan. Bunlardan en önemlileri şunlardır:

  • edebug
  • eval-defun
  • eval-son-sexp
  • balçık

Var olan bir çok kodu bozar mı?

Doğru yaparsan olmaz.

Bu organik olması gereken bir şey mi, yoksa gerçekten makrolar üzerine inşa edilebilir mi?

İdeal olarak organik olur, genellikle geliştirme listesinde ortaya çıktığında tartışılır. Ancak üzerine inşa edilirken yeterince iyi yapılabilir .
İşte bu listeden alınan birkaç örnek :


1
Teşekkürler - bu konuda çok bilgilendirici bir yaklaşım oldu. Son noktanı merak ediyorum, namesçözümün. Ben organik, yerleşik çözümü değil çok uzak gelecekte geliyor, yoksa sadece yerleüik benimsemelidir eğer şüphelenmek için bir neden var mı merak üzerinde solüsyon sağladığınız.
Dan

1
@Dan Evet, var. . Bununla birlikte, bu arada İsimler'i benimsememek için hiçbir sebep yok . Kullanarak herhangi bir paket, böylece Emacs' sözleşmeler ile tam uyumlu olduğunu Adları kullanarak durdurmak için serbesttir Adları herhangi bir zamanda ve kullanıcı bir şey bilmez.
Malabarba

Gerçekten namelessbu listeye eklemelisiniz :) Bu harika bir fikir ve sorunu çok özenle çözüyor.
Clément

22

Bu en son emacs-devel'de tartışıldığı zaman, Lars gibi insanlar bir şeyler yapmayı sevdiklerini belirtti M-x grep. Elisp'e isim alanları eklemek çok zor olmamalı, ancak tüm bunları doğru şekilde ele alabilmek için tüm bilinen araçları elde etmek başka bir konudur.


Bunun en çok kullanılan ortak işlevler (veya hepsi için belki) için takma adlar oluşturarak kolayca 'düzeltilebileceğini' düşünüyorum
Jesse,

1
Bir paketi geliştirirken genellikle "grep" ihtiyacı ortaya çıkar, bir değişken / işlevin diğer paketlerde nerede kullanılabileceğini bilmeniz gerekir, böylece yalnızca belirli önemli olanlar için herhangi bir değişken değişken / işlev için geçerli olabilir. Bu nedenle, birkaç takma ad eklemek fark yaratmaz. Mit'in yardım etmemesinin bir başka nedeni, takma ad eklemenin bu takma adı kullanmayan kullanımları bulmanıza yardımcı olmayacağıdır.
Stefan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.