Каковы преимущества схемных макросов?
Почему кто-то предпочитает макросы Scheme над Common Lisp макросами (и я действительно хочу знать тоже, я не пытаюсь быть троллем)?
Мой опыт работы с Lisp newb заключается в том, что общие макросы стиля Lisp намного легче изучить, чем макросы Scheme. Я еще не вижу никаких преимуществ для макросов Scheme, но, конечно, это не значит, что они не существуют.
Я знаю, что макросы Scheme являются "гигиеническими", но я все еще не убежден, что это стоит дополнительной сложности. С другой стороны, очевидно, есть люди, которые убеждены, что это необходимо, иначе не было бы реализаций макросов Scheme в Common Lisp.
Короче говоря, кто-то может защитить макросы Scheme?
Ответы
Ответ 1
Макросы схемы вводят две, по существу ортогональные, концепции: гигиена и сопоставление образцов. Гигиена менее важна в lisp2, как Common Lisp. Язык сопоставления шаблонов отражает многие общие идиомы макросов, но проблема состоит в том, что он по существу отличается от схемы. Вероятно, лучшее введение в схемы макросов, наряду с некоторыми из обоснований позади них, - это Шрирам Кришнамурти PLAI главы 36 и 37.
Я подозреваю, что причина, по которой люди пишут схемы макросов типа схемы в общем lisp, больше подходит для соответствия шаблону, чем для гигиены.
Ответ 2
Поскольку они используют другой, не-Scheme язык, макросы Scheme менее мощные, чем Common Lisp макросы в почти формальном смысле: вы можете делать с ними произвольные вычисления времени компиляции, но они волосатые и запутанные. Это очень похоже на аргумент за использование set!
: менее мощных set!
свободных языков создает меньше багги кода в обмен на неудобную обработку состояния. Каждый раз, когда вы торгуете властью за дисциплину, вы делаете ставку на то, что в конечном итоге вы сможете построить более сложные системы.
Это лучший аргумент, который я видел для макросов Scheme над Common Lisp: если вы строите сложный язык поверх Scheme, вы с меньшей вероятностью вводите тонкие макросы, если будете придерживаться стандартной макросистемы.
Лично я не строю большие языки с помощью макросов, поэтому предпочитаю Common Lisp макросы. Я нахожу их намного легче для небольших заданий и избегания захвата переменной и т.д. Не очень важно в небольших масштабах.
Ответ 3
Макросы схемы сохраняют ссылочную прозрачность.
Цитирование "Справочного руководства по Guile" 6.10.2.2 Гигиена:
макросы синтаксических правил (..) сохраняют ссылочную прозрачность. Когда ты читать определение макроса, любые свободные привязки в этом макросе разрешаются относительно определения макроса; и когда вы читаете макрос экземпляр, все свободные привязки в этом выражении разрешены относительно выражения.
Это свойство иногда называют гигиеной, и оно помогает в коде чистота. В ваших определениях макросов вы можете свободно вводить временные переменные, не беспокоясь о непреднамеренном введении привязки к расширению макроса.
Стандартная схема предлагает syntax-rules
и syntax-case
.