Есть много восхитительных мнений о макросах в Lisp, но я действительно не могу найти праймер, который я могу использовать в своем ежедневном рабочем процессе. Я веб-разработчик, но использую emacs около 10 лет. И я хочу понять, действительно ли макросы действительно полезны для всех, или это просто функция убийцы для очень конкретных задач.Являются ли макросы lisp полезными в типичной разработке?
Большинство праймеров с использованием макросов - это попытки сделать DSL поверх lisp. Ну, это может быть полезно иногда, но создание синтаксических расширений в коммерческом развитии - это плохая практика, насколько я понимаю. Большинство языков имеют стандартные функции, такие как, если, в то время как операторы foreach, общие концепции, такие как классы, пространства имен, модули, замыкания (lambdas). Таким образом, все программы, как правило, построены из таких произведений, и новый программист, изучающий ваш код, уже знает, что штук и может ими управлять. А в случае DSL, построенного на макросах, программисту нужно не только изучить бизнес-логику, но и узнать свой DSL. Коммерческая значимость для типичных решений с простой поддержкой и высокой заменой программистов.
Далее - создание шаблонов двигателей поверх макросов. Ну, теперь отраслевым стандартом является Twig, Jinja2, Template Toolkit - вы можете создать свою собственную систему шаблонов, но ... Это 2015 год, а не 2001 год, когда был создан Viaweb Пола Грэма. Современные системы шаблонов очень похожи друг на друга - они разрабатывались годами, и у них много концепций, таких как блоки, фильтры, наследование, i18n. Так что в 2001 году создание собственного шаблонизатора имело смысл, но теперь есть сложные шаблонные двигатели для всех suddens жизни.
Далее - использование макросов для создания алгоритмов независимо от данных, переданных им. Эта концепция имеет смысл, но действительно ли ей нужны макросы? Например, большинство языков скриптинга поддерживают передачу функций по ссылке - это означает, что вы можете создавать абстрактную функцию, которая будет принимать данные и функцию обработки данных в качестве аргументов. Конечно, вам нужно будет создать несколько функций обработки данных для поддержки всех необходимых типов данных, но вы сможете передать все те, чтобы абстрактная функция была короткой, как сопоставимый макрос lisp.
Далее - сами алгоритмы. В настоящее время 90% из нас, веб-разработчиков, просто используют готовые библиотеки и алгоритмы. Поэтому, даже если я ошибаюсь в предыдущем параграфе, роль макросов очень мала в нашей работе.
Итак, вы действительно используете макросы каждый день, или вы просто просто снимаете некоторые проблемы с макросами очень изящно и экстраполируете этот hapinees на следующие несколько месяцев?
Макросы используются только тогда, когда они необходимы, а не для удовольствия или просто для макросов. Если вы можете моделировать свое приложение и свои внутренние DSL таким образом, что они могут быть реализованы с использованием функций, тем лучше. – progo
Я просто думаю, что теряю очень полезный инструмент, потому что я не понимаю, где он может быть применим. Все примеры макросов, которые я нашел, слишком синтетичны. – Rengraz
Используйте макросы, когда вы не можете делать то, что вам нужно другим способом. Для многих контекстов программирования это редко. К сожалению, некоторые программисты Lisp пытаются убедить других в значении Lisp, обсуждая макросы. Это один ответ на вопрос «Почему так много круглых скобок?» вопрос. Lisp настолько гибкий, что макросы не требуются, за исключением особых потребностей. – Mars