Clojure'daki hijyenik makro eksikliğinden kaynaklanan pratik problem nedir?


11

Clojure makrolarının yazmanın daha kolay olduğunu ancak Racket'in hijyenik makroları kadar güvenilir olmadığını duydum. Sorumun 2 bölümü var:

  1. Nasıl gensym hijyenik makrolar farklı?
  2. Raket makroları, Clojure'un vermediğini ne sağlar? (güvenlik, kompostlanabilirlik veya herhangi bir şey olsun)

2
Hijyenik makrolar, genişlemelerinin tanımlayıcıların yanlışlıkla yakalanmaması için garanti edilen makrolardır. Kazara yakalamanın genel sorunu, Lisp topluluğunda hijyenik makroların tanıtılmasından önce iyi biliniyordu. Makro yazarlar, sorunu önlemek için benzersiz tanımlayıcılar (örn. Gensym) oluşturacak dil özelliklerini veya gizlenmiş tanımlayıcıları kullanırlar. Hijyenik makrolar, makro genişleticinin kendisine entegre edilmiş yakalama sorununa programlı bir çözümdür. en.wikipedia.org/wiki/Hygienic_macro
Robert Harvey

3
[Racket] hijyenik makro sistemi makronuzun nasıl çalıştığı konusunda derin bilgiye sahip olduğundan, makronuz çevreye son derece iyi entegre edilmiştir: sözdizimi vurgulama doğru çalışır, otomatik değişken yeniden adlandırma doğru çalışır, çapraz referanslama doğru çalışır ve diğerleri [Racket] IDE özelliklerini kaydırın. Başka bir deyişle, hijyen sizi sadece değişken yakalama gibi basit hatalara karşı korumakla kalmaz, aynı zamanda kodunuzun Ortak LISP için var olamayan araçlarla resmi olarak analiz edilmesini sağlar. randomhacks.net/2002/09/13/hygienic-macros
Robert Harvey

Yanıtlar:


6

Hijyenik makroların avantajı dil yeteneğinden biri değildir - gensymdoğru zamanlarda iyi hijyen ve dikkatli alıntı / alıntı yapma özelliklerine sahip makrolar yazabilirsiniz . Bununla birlikte, hijyenik makrolar , makrolarınızın iyi hijyene sahip olmasını sağlar . Bu açıdan, biraz tip kontrolü gibi.

Hijyenik makrolara yönelik takım avantajları da olabilir. Çoğu hijyenik makro sistemi, makronuzun ne yaptığı ve nasıl yaptığı konusunda sıkı kontroller uygular (örneğin, Şema'nın tanımladığı bir makro syntax-casegenişletildiğinde rastgele kod yürütemezsiniz ). Bu, makronuzu “anlayan” ve ek takım desteği sağlayabilen programlar yazmanızı kolaylaştırabilir.

Öte yandan hijyenik olmayan makroların yararlı olabileceği bazı durumlar vardır. Örneğin, aslında belirli bir değişken (örneğin, anaphoric makrolar ) için bir bağlayıcı yakalamak istiyorsanız , o zaman sadece hijyenik makrolarınız varsa şansınızın olmadığını düşünüyorum.


2
gensymmakronun makro kullanıcıyla yanlışlıkla uğraşmasını önler, ancak makro kullanıcısının makroyla uğraşmasını engellemez. Örneğin, bir makro kullanıcısı yeniden tanımlayabilir ifveya buna benzer bir şey yapabilir . ("Bunu neden herkes yapsın" sorusu önemsizdir. Bu, bunun mümkün olduğunu gösteren ve hijyenik olmayan makrolarla ilgili akıl yürütmenin zor olduğunu gösteren basit bir örnektir)
Phil

2
Hijyenik olmayan makrolar kesinlikle faydalıdır. Şema'dan emin değilim, ancak Racket'in birçok "hijyen bükme" işlemi var. Dilin makroları varsayılan olarak hijyeniktir. Hijyeni bozduğunuzda sizi çok bilinçlendiriyorlar.
Phil
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.