Подтвердить что ты не робот

Каковы преимущества схемных макросов?

Почему кто-то предпочитает макросы Scheme над Common Lisp макросами (и я действительно хочу знать тоже, я не пытаюсь быть троллем)?

Мой опыт работы с Lisp newb заключается в том, что общие макросы стиля Lisp намного легче изучить, чем макросы Scheme. Я еще не вижу никаких преимуществ для макросов Scheme, но, конечно, это не значит, что они не существуют.

Я знаю, что макросы Scheme являются "гигиеническими", но я все еще не убежден, что это стоит дополнительной сложности. С другой стороны, очевидно, есть люди, которые убеждены, что это необходимо, иначе не было бы реализаций макросов Scheme в Common Lisp.

Короче говоря, кто-то может защитить макросы Scheme?

4b9b3361

Ответ 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.