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:
- Czym
gensym
różnią się od makr higienicznych? - Co zapewniają makra Racket, których nie ma Clojure? (czy to bezpieczeństwo, kompozycja, czy cokolwiek innego)
Odpowiedzi:
Zaletą makr higienicznych nie jest umiejętność posługiwania się językiem - możesz pisać makra, które mają dobrą higienę, używając
gensym
ostroż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-case
jest 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.
źródło
gensym
zapobiega 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ęif
lub 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)