Я слышал, что макросы Clojure легче писать, но они не так надежны, как гигиенические макросы Racket. Мой вопрос состоит из 2 частей:
- Чем
gensym
отличаются гигиенические макросы? - Что предоставляют макросы Racket, чего нет у Clojure? (будь то безопасность, композитность или что-нибудь)
Ответы:
Преимущество гигиенических макросов заключается не в языковых возможностях - вы можете писать макросы с хорошей гигиеной, используя
gensym
аккуратные цитаты / отрывки в нужное время. Однако гигиенические макросы гарантируют, что ваши макросы имеют хорошую гигиену. В этом отношении это немного похоже на проверку типов.Там также могут быть преимущества инструментов для гигиенических макросов. Большинство гигиенических макросистем устанавливают строгий контроль над тем, что делает ваш макрос и как он это делает (например, вы не можете выполнить произвольный код, когда макрос, определенный схемами,
syntax-case
раскрыт). Это может облегчить написание программ, которые «понимают» ваш макрос и могут обеспечить дополнительную поддержку инструментов.С другой стороны, в некоторых случаях полезны негигиенические макросы. Например, если вы действительно хотите захватить привязку для определенной переменной (например, анафорических макросов ), то я думаю, что вам не повезло, если у вас есть только гигиенические макросы.
источник
gensym
предотвращает случайное взаимодействие макроса с пользователем макроса, но не предотвращает его взаимодействие с макросом. Например, пользователь макроса может переопределитьif
или что-то в этом роде. (Вопрос «почему кто-то так поступает» не имеет значения. Это простой пример, демонстрирующий, что это возможно, и сложно рассуждать о негигиенических макросах)