Каковы преимущества схемы макросов? - PullRequest
21 голосов
/ 14 августа 2010

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

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

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

Короче говоря, может ли кто-нибудь защитить макросы Схемы от меня?

Ответы [ 3 ]

18 голосов
/ 14 августа 2010

Макросы схемы вводят две, по существу, ортогональные концепции: гигиена и сопоставление с образцом.Гигиена менее важна для lisp2, как Common Lisp.Язык сопоставления с образцом захватывает многие из распространенных макродинамических выражений, но имеет проблему, заключающуюся в том, что он по сути отличается от языка схемы.Вероятно, лучшим введением в макросы схемы, наряду с некоторыми обоснованиями, являются PLAI главы 36 и 37 Шрирам Кришнамурти.LISP больше подходит для сопоставления с образцом, чем для гигиены.

7 голосов
/ 15 августа 2010

Поскольку они используют другой язык, отличный от Scheme, макросы Scheme менее мощны, чем макросы Common Lisp, в почти формальном смысле: вы можете выполнять произвольные вычисления во время компиляции с ними, но это сложнои запутанный.Это очень похоже на аргумент за неиспользование set!: менее мощные set! свободные языки производят меньше глючного кода в обмен на неловкую обработку состояния.Каждый раз, когда вы обмениваете силу на дисциплину, вы держите пари, что вы сможете строить более сложные системы в долгосрочной перспективе.

Это лучший аргумент, который я видел для макросов Scheme по сравнению с макросами Common Lisp: если выЕсли вы строите сложный язык поверх Scheme, вы вряд ли будете вносить незначительные ошибки макросов, если будете придерживаться стандартной системы макросов.

Лично я не строю большие языки с помощью макросов, поэтому я предпочитаю CommonЛисп макросы.Я нахожу их намного проще для небольших работ, и избегая захвата переменных и т. Д., Не имеет большого значения в небольшом масштабе.

4 голосов
/ 31 августа 2011

Макросы схемы сохраняют ссылочная прозрачность .

Цитирование «Справочного руководства по Guile» 6.10.2.2 Гигиена:

макросы синтаксических правил (..)сохранить ссылочную прозрачность.Когда вы читаете определение макроса, все свободные привязки в этом макросе разрешаются относительно определения макроса;и когда вы читаете создание экземпляра макроса, все свободные привязки в этом выражении разрешаются относительно выражения.

Это свойство иногда называется гигиеной и помогает в чистоте кода.В определениях макросов вы можете свободно вводить временные переменные, не беспокоясь о непреднамеренном введении привязок в расширение макроса.

Стандартная схема предлагает syntax-rules и syntax-case.

...