Jaki praktyczny problem wynika z braku higienicznych makr w Clojure?

11

Słyszałem, że makra Clojure są łatwiejsze do pisania, ale nie tak niezawodne jak makra higieniczne Racket. Moje pytanie składa się z 2 części:

  1. Czym gensymróżnią się od makr higienicznych?
  2. Co zapewniają makra Racket, których nie ma Clojure? (czy to bezpieczeństwo, kompozycja, czy cokolwiek innego)
Alex
źródło
2
Makra higieniczne to makra, których rozszerzenie gwarantuje, że nie spowoduje przypadkowego przechwycenia identyfikatorów. Ogólny problem przypadkowego schwytania był dobrze znany społeczności Lisp przed wprowadzeniem makr higienicznych. Autorzy makr użyliby funkcji językowych, które wygenerowałyby unikalne identyfikatory (np. Gensym) lub użyli zaciemnionych identyfikatorów, aby uniknąć problemu. Makra higieniczne są programowym rozwiązaniem problemu przechwytywania, który jest zintegrowany z samym ekspanderem makr. en.wikipedia.org/wiki/Hygienic_macro
Robert Harvey
3
Ponieważ higieniczny system makr [Rakieta] ma głęboką wiedzę o tym, jak działa twoje makro, twoje makro jest wyjątkowo dobrze zintegrowane ze środowiskiem: podświetlanie składni działa poprawnie, automatyczne zmienianie nazw zmiennych działa poprawnie, odsyłacze działają poprawnie, podobnie jak wszystkie inne zręczne funkcje [Racket] IDE. Innymi słowy, higiena nie tylko chroni przed prostymi błędami, takimi jak przechwytywanie zmiennych - pozwala formalnie analizować kod za pomocą narzędzi, które po prostu nie mogłyby istnieć dla Common LISP. randomhacks.net/2002/09/13/hygienic-macros
Robert Harvey

Odpowiedzi:

6

Zaletą makr higienicznych nie jest umiejętność posługiwania się językiem - możesz pisać makra, które mają dobrą higienę, używając gensymostrożnego cytowania / cofania cudzysłowów we właściwym czasie. Makra higieniczne zapewniają jednak higienę makr . Pod tym względem przypomina to sprawdzanie typu.

Makra higieniczne mogą mieć również zalety narzędziowe. Większość higienicznych systemów makr narzuca ścisłą kontrolę nad tym, co robi twoje makro i jak to robi (np. Nie możesz wykonać dowolnego kodu, gdy makro zdefiniowane przez Scheme syntax-casejest rozwinięte). Może to ułatwić pisanie programów, które „rozumieją” twoje makro i mogą zapewnić dodatkowe wsparcie dla narzędzi.

Z drugiej strony istnieją przypadki, w których makrofinansowe makra mogą być przydatne. Na przykład, jeśli naprawdę chcesz uchwycić powiązanie dla określonej zmiennej (np. Makra anaforyczne ), to myślę, że nie masz szczęścia, jeśli masz tylko makra higieniczne.

Nathan Davis
źródło
2
gensymzapobiega przypadkowemu zepsuciu się makra przez użytkownika makra, ale nie zapobiega temu przez użytkownika makra. Na przykład użytkownik makra może zmienić definicję iflub coś takiego. (Pytanie „dlaczego ktokolwiek miałby to zrobić” jest nieistotne. Jest to prosty przykład, który pokazuje, że jest to możliwe, i trudno jest rozumować makra niehigieniczne)
Phil
2
Niehigieniczne makra są z pewnością przydatne. Nie jestem pewien co do Schematu, ale Rakieta ma wiele operacji „gięcia higienicznego”. Makra tego języka są domyślnie higieniczne. Sprawiają, że jesteś bardzo przytomny, gdy łamiesz higienę.
Phil