Lisp makrolarının tipik uygulamaları nelerdir?


19

Bazı LISP öğrenmeye çalışıyorum ve LISP makrolarının önemi hakkında çok şey okudum, bu yüzden onlarla birlikte çalışma deneyimi elde etmek istiyorum.

Gerçek dünyadaki bir sorunu çözmek ve bu programlama yapısının faydasını anlamak için makroları kullanmamı sağlayacak pratik bir uygulama alanı önerebilir misiniz?

NOT

Bu bir sonraki soruda hangi projeyi yapmalıyım ? LISP makrolarıyla hangi tür problemlerin çözüldüğünü anlamak istiyorum. Örneğin, soyut veri türlerini uygulamak için iyi mi? Bu yapı neden dile eklendi? Basit fonksiyonlarla çözülemeyen ne tür problemleri çözüyor?


Yanıtlar:


9

Lisp makroları birkaç farklı özelliği birleştirir:

  1. Makrolar yeni sözdizimini tanımlar input giriş olarak kaynak kodu kullanırlar
  2. Makrolar genellikle derleme zamanında çalıştırılır
  3. Makrolar kaynak kodu oluşturur

En iyi uygulamalar tüm bu özellikleri kullanır. Muhtemelen en iyi bilinen örnek Common Lisp'teki (döngü…) , bu özelliklerden biri olmadan kullanışlılığına yakın bir yerde olmaz. Kaynak giriş olarak olmasaydı, döngü içindeki eylemleri tanımlamak garip olurdu; derleme zamanı genişlemesi olmadan çok yavaş olurdu; ve kod üretme olmadan çalıştırılamaz.

Diğer bir güzel örnek, Pratik Ortak Lisp , Pratik: İkili Dosyaları Ayrıştırma bölümündeki ikili serileştirme bölümüdür .

LINQ benzeri bir şey uygulayan bir sorgu makrosu başka bir iyi uygulama olabilir. Ancak LINQ'yu olduğu kadar güzel yapan otomatik tamamlama eksik olacaktır. Bugün XML girişleri (örneğin XAML) olan özel amaçlı kod üreteçleri tarafından çözülen hemen hemen her şey Lisp makroları kullanılarak da uygulanabilir.


"Pratik Ortak Lisp" kitabını yeni aldım, önerdiğiniz örneğe bir göz atacağım.
Giorgio

2

Ortak lisp makroları hakkında düşünmek gibi onlar değerlendirilecek kodu döndüren işlevler, ancak bu kodu döndürmeden önce argümanlarını 'etmeyin' olmasıdır. Fonksiyonlar da bir şey döndürür, ancak bedenleri değerlendirilmeden önce her bir argümanı değerlendirirler. Makrolar bunu yapmaz.

'On Lisp' deki Paul Graham (IMHO) makrolar ve fonksiyonlar arasındaki farkların en iyi açıklamalarından birini sunmakta ve örtüşmelerini ve tekliklerini tartışmaktadır. Birçok kod parçası bir işlev veya makro olarak yazılabilir, ancak yalnızca bir makronun çalışacağı durumlar vardır. Kafanı bunun etrafına sardığın zaman, sanırım lisp içinde makroların özü var.

Bir işlevin çalışmadığı bir makro örneği olarak, 'aif'e (eğer anaphoric) bakın. Bu sadece birkaç satır kod ve nereden başlayacağımla ilgili tavsiyem.

Ve kasıtlı değişken yakalamadan yararlanan Common Lisp'in anaphoric versiyonuna bakın. Scheme'nin otomatik olarak hijyenik versiyonu IMO 'gerçek anlaşma' değildir. Değişken yakalama lisp makrolojisinin önemli bir parçasıdır ve daha güçlü ve kullanışlı makrolardan bazıları kesinlikle bundan yararlanır.

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.