Emacs Lisp - Emacs Lisp

Emacs Lisp
EmacsIcon.svg
Emacs logosu
Paradigmaİşlevsel, meta, yansıtıcı
AileLisp
Tarafından tasarlandıRichard Stallman,
Guy L. Steele, Jr.
GeliştiriciGNU Projesi
İlk ortaya çıktı1985; 35 yıl önce (1985)
Kararlı sürüm
26.2 / 12 Nisan 2019; 19 ay önce (2019-04-12)
Yazma disipliniDinamik, kuvvetli
DürbünDinamik, isteğe bağlı olarak sözcüksel
PlatformEmacs
işletim sistemiÇapraz platform
LisansGPLv3
Dosya adı uzantıları.el, .elc
Tarafından etkilenmiş
Ortak Lisp, Maclisp

Emacs Lisp bir lehçe of Lisp programlama dili olarak kullanılan komut dosyası dili tarafından Emacs (bir Metin düzeltici en yaygın şekilde ilişkili aile GNU Emacs ve XEmacs ). Emacs'de yerleşik olarak bulunan düzenleme işlevlerinin çoğunu uygulamak için kullanılır, geri kalanı ise C Lisp olduğu gibi çevirmen. Emacs Lisp ayrıca ElispBununla birlikte, bu isimde daha eski, ilgisiz bir Lisp lehçesi de vardır.[1]

Emacs kullanıcıları, Emacs'i özelleştirmek ve genişletmek için genellikle Emacs Lisp kodunu yazar. Diğer seçenekler şunları içerir: Özelleştirmek sürüm 20'den beri GNU Emacs'ta bulunan özellik. Kendisi Emacs Lisp'te yazılmıştır, Customize bir dizi tercihler Kullanıcının seçenekleri belirlemesine ve çalışan Emacs oturumundaki etkilerini önizlemesine izin veren sayfalar. Kullanıcı değişikliklerini kaydettiğinde, Customize yalnızca gerekli Emacs Lisp kodunu kullanıcının yapılandırma dosyası, kullanıcının kendi dosyasını değiştirme olasılığını önlemek için yalnızca Özelleştir'in kullandığı özel bir dosyaya ayarlanabilir.

Emacs Lisp aynı zamanda bir komut dosyası dili tıpkı Unix Bourne kabuğu veya Perl, Emacs'ı arayarak toplu modu. Bu şekilde, komut satırından veya çalıştırılabilir bir dosya aracılığıyla çağrılabilir ve tamponlar ve hareket komutları gibi düzenleme işlevleri, normal modda olduğu gibi program tarafından kullanılabilir. Hayır Kullanıcı arayüzü Emacs toplu modda başlatıldığında gösterilir; sadece aktarılan komut dosyasını çalıştırır ve komut dosyasından herhangi bir çıktıyı görüntüleyerek çıkar.

Diğer Lisp lehçelerine kıyasla

Emacs Lisp en çok Maclisp, daha sonra bazı etkilerle Ortak Lisp.[2] Destekler zorunlu ve fonksiyonel programlama yöntemler. Richard Stallman Emacs'ın yeniden yazımı için uzantı dili olarak Lisp'i seçti (orijinal Metin Düzenleyici ve Düzeltici (TECO), işlevleri veri olarak işleme yeteneği de dahil olmak üzere güçlü özellikleri nedeniyle. Common Lisp standardı henüz formüle edilmemiş olmasına rağmen, Şema Stallman yeniden yazarken vardı Gosling Emacs GNU Emacs içine. İş istasyonlarındaki nispeten düşük performansı nedeniyle kullanmamayı seçti ( mini bilgisayarlar bu Emacs'in geleneksel eviydi) ve daha kolay optimize edilebileceğini düşündüğü bir lehçe geliştirmek istedi.[3]

Emacs'ta kullanılan Lisp lehçesi, daha modern Common Lisp'ten önemli ölçüde farklıdır ve Şema uygulama programlaması için kullanılan lehçeler. Emacs Lisp'in göze çarpan bir özelliği, sözcüksel değil dinamik kullanmasıdır. dürbün varsayılan olarak (aşağıya bakın). Yani bir işlev, çağrıldığı kapsamdaki yerel değişkenlere başvurabilir, ancak tanımlandığı kapsamda olmayabilir.

Misal

Emacs Lisp'in arkasındaki mantığı anlamak için, genel amaçlı bir programlama dili uygulamak yerine çok yönlü bir metin editörü yapmaya özgü veri yapıları ve özellikleri sağlamaya vurgu yapıldığını hatırlamak önemlidir. Örneğin, Emacs Lisp bir dosyayı bir defada bir satırda kolayca okuyamaz - dosyanın tamamı bir Emacs arabelleğine okunmalıdır. Bununla birlikte, Emacs Lisp, modlar tarafından tanımlanan bir cümle, paragraf veya daha yüksek sözdizimsel düzeydeki arabellek metninde gezinmek ve değiştirmek için birçok özellik sağlar.

Aşağıda, Emacs Lisp ile yazılmış bir Emacs eklentisinin basit bir örneği verilmiştir. Emacs'ta düzenleme alanı, adı verilen ayrı alanlara bölünebilir. pencereler, her biri farklı bir tampon. Tampon, Emacs'in belleğine (muhtemelen bir dosyadan) yüklenen ve bir metin belgesine kaydedilebilen bir metin bölgesidir.

Kullanıcılar varsayılana basabilir C-x 2 anahtar bağlama yeni bir pencere açmak için. Bu, Emacs Lisp işlevini çalıştırır aşağıda bölünmüş pencere. Normalde, yeni pencere göründüğünde, öncekiyle aynı arabelleği görüntüler. Diyelim ki, bir sonraki kullanılabilir tamponu göstermesini istiyoruz. Bunu yapmak için, kullanıcı ya mevcut bir Emacs Lisp kaynak dosyasına ya da boş bir Emacs arabelleğine aşağıdaki Emacs Lisp kodunu yazar:

(defun benim-bölünmüş-pencere-fonksiyonum ()  (etkileşimli)  (aşağıda bölünmüş pencere)  (set-window-buffer (sonraki pencere) (diğer tampon)))(global-set-key "C-x2" 'bölünmüş-pencere-işlevi )

İlk ifade, (defun ...), yeni bir işlevi tanımlar, benim-bölünmüş-pencere-fonksiyonumhangi çağırır aşağıda bölünmüş pencere (eski pencere bölme işlevi), ardından yeni pencereye başka bir (yeni) arabellek görüntülemesini söyler. İkinci ifade, (global-set-key ...) "C-x 2" tuş dizisini yeni işleve yeniden bağlar.

Bu, adı verilen özellik kullanılarak da yazılabilir. tavsiye, kullanıcının oluşturmasına izin veren sarmalayıcılar kendi işlevlerini tanımlamak yerine mevcut işlevlerin etrafında. Bu, anahtar bağlamaların değiştirilmesini ve orijinal işlevin çağrıldığı her yerde çalışmayı gerektirmeme avantajına sahiptir, ayrıca yazması daha basittir, ancak hata ayıklamayı daha karmaşık hale getirme dezavantajıdır. Bu yüzden, tavsiye GNU Emacs kaynak kodunda izin verilmez,[4] ancak bir kullanıcı isterse, yukarıdaki kodu aşağıdaki gibi yeniden uygulamak için öneri özelliği kodunda kullanılabilir:

(defadvice aşağıda bölünmüş pencere  (sonra benim-pencere-bölme-tavsiyem ilk () etkinleştirmek)  (set-window-buffer (sonraki pencere) (diğer tampon)))

Bu talimat verir aşağıda bölünmüş pencere kullanıcı tarafından sağlanan kodu, her çağrıldığında, işlevin geri kalanını çalıştırmadan önce yürütmek. Ayrıca tavsiye, orijinal işlevden sonra, onun etrafında - orijinali tam anlamıyla sararak veya tavsiyenin sonuçlarına göre orijinal işlevi koşullu olarak yürütmek için de belirtilebilir.

Emacs 24.4 yerini alıyor[5] bu defadvice mekanizma ile tavsiye-ekledaha esnek ve daha basit olduğu iddia ediliyor.[6] Yukarıdaki tavsiye, yeni sistem kullanılarak şu şekilde yeniden uygulanabilir:

(defun bölünmüş bir sonraki pencereye geç ()  (set-window-buffer (sonraki pencere) (diğer tampon)))(tavsiye-ekle 'alt-pencere bölme :önce #'bölünmüş bir sonraki pencereye geç)

Bu değişiklikler, kod olur olmaz yürürlüğe girer. değerlendirildi. Emacs'i yeniden derlemek, yeniden başlatmak veya hatta yeniden doldurmak bir yapılandırma dosyası. Kod bir Emacs başlatma dosyasına kaydedilirse, Emacs bir sonraki başladığında uzantıyı yükleyecektir. Aksi takdirde, Emacs yeniden başlatıldığında değişikliklerin manuel olarak yeniden değerlendirilmesi gerekir.

Kaynak kodu

Emacs Lisp kodu şurada saklanır: dosya sistemleri gibi düz metin dosyalar, dosya adı son ekine göre ".el". Kullanıcının başlatma dosyası bir istisnadır ve genellikle".emacs"herhangi bir Emacs Lisp kodu olarak değerlendirilmesine rağmen. Emacs'in son sürümleri (40 yıllık bir programdaki" yeni ", kabaca 1990'ların ortasından bu yana yayınlanan herhangi bir sürüm anlamına gelir) ~ / .emacs.el ve ~ / .emacs.d / init.el. Ek olarak, kullanıcılar komut satırında bir yapılandırma dosyası olarak yüklenecek herhangi bir dosyayı belirtebilir veya hiçbir yapılandırma dosyasının yüklenmeyeceğini açıkça belirtebilir. Dosyalar yüklendiğinde, bir çevirmen Emacs programının bileşeni, işlevleri ve değişkenleri okuyup ayrıştırarak bellekte saklar. Daha sonra diğer düzenleme işlevleri ve kullanıcı komutları tarafından kullanılabilirler. Düzenleyiciyi yeniden başlatmadan veya yapılandırma dosyasını yeniden yüklemeden işlevler ve değişkenler serbestçe değiştirilebilir ve yeniden tanımlanabilir.

Zaman ve bellek alanından tasarruf etmek için, Emacs'ın çoğu işlevselliği yalnızca gerektiğinde yüklenir. Emacs ile birlikte gönderilen her bir isteğe bağlı özellik seti, bir Emacs kodu koleksiyonu tarafından uygulanır. paket veya kütüphane. Örneğin, program kaynak kodunda anahtar kelimeleri vurgulamak için bir kitaplık ve oyununu oynamak için bir kitaplık vardır. Tetris. Her kitaplık, bir veya daha fazla Emacs Lisp kaynak dosyası kullanılarak gerçekleştirilir. Kitaplıklar bir veya daha fazlasını tanımlayabilir ana modlar işlevlerini etkinleştirmek ve kontrol etmek için.

Emacs geliştiricileri C de belirli işlevleri yazarlar. Bunlar ilkellerolarak da adlandırılır yerleşik işlevler veya subrs. İlkel öğeler Lisp kodundan çağrılabilse de, yalnızca C kaynak dosyaları düzenlenerek ve yeniden derlenerek değiştirilebilirler. İçinde GNU Emacs ilkeller harici kitaplıklar olarak kullanılamaz; Emacs yürütülebilir dosyasının bir parçasıdır. İçinde XEmacs, işletim sisteminin dinamik bağlantı desteği kullanılarak bu tür temel öğelerin çalışma zamanında yüklenmesi mümkündür. Fonksiyonlar, Emacs Lisp'te bulunmayan harici verilere ve kitaplıklara erişime ihtiyaç duydukları için veya C ile Emacs Lisp'in karşılaştırmalı hızının önemli bir fark yaratacak kadar sık ​​çağrıldıkları için ilkel olarak yazılabilir.

Bununla birlikte, C kodundaki hatalar kolaylıkla segmentasyon ihlalleri veya düzenleyiciyi çökerten daha ince hatalara ve Emacs Lisp ile doğru şekilde etkileşime giren C kodunu yazdığından Çöp toplayıcı hataya meyillidir, ilkel olarak uygulanan işlevlerin sayısı gerekli minimumda tutulur.

Bayt kodu

Bayt derleme Emacs Lisp kodunun daha hızlı çalışmasını sağlayabilir. Emacs, bir derleyici Emacs Lisp kaynak dosyalarını, adı verilen özel bir gösterime çevirebilen bayt kodu. Emacs Lisp bayt kodu dosyalarında dosya adı soneki ".elc". Kaynak dosyalara kıyasla bayt kodu dosyaları daha hızlı yüklenir, diskte daha az yer kaplar, yüklendiğinde daha az bellek kullanır ve daha hızlı çalışır.

Bayt kodu hala ilkellerden daha yavaş çalışır, ancak bayt kodu olarak yüklenen işlevler kolayca değiştirilebilir ve yeniden yüklenebilir. Ayrıca bayt kodu dosyaları platformdan bağımsızdır. Emacs ile dağıtılan standart Emacs Lisp kodu bayt kodu olarak yüklenir, ancak eşleşen kaynak dosyalar genellikle kullanıcının referansı olarak sağlanır. Kullanıcı tarafından sağlanan uzantılar, ne kadar büyük ne de hesaplama açısından yoğun olmadıklarından genellikle bayt olarak derlenmez.

Dil özellikleri

Özellikle, "cl" paketi oldukça büyük bir alt kümeyi Ortak Lisp.

Emacs Lisp (diğer bazı Lisp uygulamalarından farklı olarak) bunu yapmaz kuyruk arama optimizasyonu.[7] Bu olmadan, kuyruk özyinelemeleri sonunda yol açabilir yığın taşması.

apel kütüphane, polysylabi platform köprüsü yardımıyla taşınabilir Emacs Lisp kodu yazılmasına yardımcı olur.

Emacs Lisp bir Lisp-2 diğer değişkenler için kullandığı ad alanından ayrı bir işlev ad alanına sahip olduğu anlamına gelir.[8]

Dinamikten sözcük kapsamına

MacLisp gibi, Emacs Lisp de dinamik dürbün, sürüm 24'ten başlayarak bir seçenek olarak statik (veya sözcüksel) sunan.[9] Dosya yerel değişkeni ayarlanarak etkinleştirilebilir sözcüksel bağlama.[10][11]

Dinamik kapsamda, bir programcı bir işlevin kapsamında bir değişken bildirirse, o işlevin içinden çağrılan alt yordamlar tarafından kullanılabilir. Başlangıçta bu, bir optimizasyon; sözcüksel kapsam belirleme hala yaygın değildi ve performansı belirsizdi. "Emacs lisp'i uygularken RMS'ye neden dinamik olarak kapsamlı olduğunu sordum ve tam yanıtı sözcüksel kapsamın çok verimsiz olduğuydu."[12] Dinamik kapsam belirleme, kullanıcı özelleştirmeleri için daha fazla esneklik sağlama amacındaydı. Bununla birlikte, dinamik kapsamın birkaç dezavantajı vardır. Birincisi, farklı işlevlerdeki değişkenler arasındaki istenmeyen etkileşimler nedeniyle büyük programlarda kolaylıkla hatalara yol açabilir. İkinci olarak, dinamik kapsam altında değişkenlere erişim, sözcüksel kapsamda olduğundan genellikle daha yavaştır.[kaynak belirtilmeli ]

Ayrıca sözcüksel bırakma "cl" paketindeki makro, Emacs Lisp programcıları için etkili sözcük alanı sağlar, ancak "cl" yaygın olarak kullanılırken, sözcüksel bırakma nadiren kullanılır.

Referanslar

  1. ^ "RUTGERS'da HEDRICK (Mngr DEC-20'ler / Dir LCSR Comp Facility" (1981-12-18). ""Common Lisp uygulaması hakkında bilgi"". "SU-AI'da rpg, MIT-AI'da jonl" a mektup. Arşivlendi 2016-09-20 tarihinde orjinalinden. Alındı 2019-07-28. Elisp (Rutgers / UCI Lisp'in genişletilmiş uygulaması) esasen tamamlandığı için, Lisp uygulamasında biraz deneyime sahibiz.
  2. ^ "GNU Emacs Lisp büyük ölçüde Maclisp ve biraz da Common Lisp tarafından. Common Lisp'i biliyorsanız, birçok benzerlik göreceksiniz. Ancak, GNU Emacs'ın bellek gereksinimlerini azaltmak için Common Lisp'in birçok özelliği çıkarılmış veya basitleştirilmiştir. Bazen basitleştirmeler o kadar serttir ki bir Common Lisp kullanıcısının kafası çok karışık olabilir. GNU Emacs Lisp'in Common Lisp'ten ne kadar farklı olduğunu zaman zaman göstereceğiz. "-" Giriş "in" Tarih "bölümünden Emacs Lisp Kılavuzuna, Emacs 21'den itibaren
  3. ^ "Dolayısıyla, bu işletim sisteminin, GNU işletim sisteminin geliştirilmesi, beni GNU Emacs'ı yazmaya iten şeydi. Bunu yaparken, mutlak minimum olası Lisp uygulamasını yapmayı amaçladım. Programların boyutu muazzam bir endişe kaynağıydı. o günlerde, sanal belleği olmayan bir megabaytlık makineleri olan insanlardı. GNU Emacs'ı kullanabilmek istiyorlardı. Bu, programı olabildiğince küçük tutmam gerektiği anlamına geliyordu. " - dan "Lisp Deneyimlerim ve GNU Emacs'ın Gelişimi"
  4. ^ "Re: [Emacs-diffs] / srv / bzr / emacs / trunk r111086: gmm-utils.el (gmm-flet". Lists.gnu.org. 2012-12-05. Alındı 2013-08-18.
  5. ^ "HABER.24.4".
  6. ^ "Eski tavsiyeleri taşıma".
  7. ^ "Ek C Common Lisp'i Taşıma". Gnu.org. Alındı 2019-10-28. Lisp programcıları, mevcut Emacs Lisp derleyicisinin kuyruk özyinelemesini optimize etmediğini not etmek isteyeceklerdir.
  8. ^ "Google Toplulukları". groups.google.com.
  9. ^ "Emacs 24.1 yayınlandı". Lists.gnu.org. Alındı 2013-08-18.
  10. ^ "Sözcüksel ciltleme". Lists.gnu.org. 2011-04-01. Alındı 2013-08-18.
  11. ^ "Dinamik Bağlama - Sözcüksel Bağlama". EmacsWiki. 2013-05-17. Alındı 2013-08-18.
  12. ^ "T". People.csail.mit.edu. Alındı 2013-08-18.

Dış bağlantılar