Задать вопрос
HoHsi
@HoHsi

В чем смысл макро программирования?

Добрый день!
В чем преимущество макро-программирования? Т.е. почему бы просто не использовать функции высшего порядка, которые я предполагаю легче дебажить, чем магию?

P.S. вопрос не ради накидывания. Хочется понять, может действительно есть ситуации, когда макросы лучший выбор.
  • Вопрос задан
  • 1057 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
Макросы позволяют приспособить лисп язык под решаемую задачу. С помощью них Вы можете добавить в язык конструкции которых вам не хватает. Бесспорно, можно все задачи решить и без макросов. К примеру clojure имеет макрос with-open, который аналогичен конструкции try-with-resources языка Java версии 7. Java программисты обходились без этой конструкции и могут и дальше ее не использовать, но с ней вы пишете меньше кода и делаете код более надежным. Программисты использующие java версии ниже 7 не могут создать такую синтаксическую конструкцию самостоятельно и пользуются веткой finaly конструкции try...catch. Чтобы такая конструкция появилась в языке понадобилось доработать компилятор. Программисты лисп языков с помощью макросов могут добавить в язык любую синтаксическую конструкцию, которой им не хватает, без изменения компилятора. К примеру clojure версии 1.6 использует JDK 1.5 в котором нет конструкции try-with-resources но с помощью макроса with-open вы уже можете пользоваться таким же функционалом. Другой пример - макрос loop языка Common Lisp по сути определяет свой собственный встроенный микро язык для реализации всевозможных циклов.
Если вам кажется, что в языке чего-то не хватает, или что вы пишете много лишнего кода, то возможно вам стоит задуматься о макросах.
Ответ написан
Комментировать
@potan
Функциональный программист
Макросы позволяют вводить в DSL новые переменные. Через функции высших порядков это делать проблематично, а переменные Lisp (или другого языка, в котором макросами реализуется DSL) могут быть в этом DSL неудобны. Например, макросами можно реализовать pattern matching.
Макросы позволяют делать более эффективный код, с функциями высших порядков приходится полагаться на оптимизатор и runtime.
Отлаживать функции высших порядков не всегда проще. Макрос можно раскрыть и оттестировать правильность раскрытия, с функциями приходится тестировать практически всю функциональность сразу.
Ответ написан
Комментировать
AlexXYZ
@AlexXYZ
O Keep Clear O
Чтобы программы могли "делать" те, кто в программировании ничего не понимает. Вы не думайте, не каждый мечтает научиться программировать. Некоторым вполне хватает и макросов.
Это у вас в голове функционал программы отделён от интерфейса. У других это монолит. )))
Ответ написан
@zahardzhan
Программа, написанная на любом языке программирования имеет форму последовательности слов и чисел.
Содержанием программы является некий вычислительный процесс, преобразующий одни данные в другие данные.
Данные которые преобразует программа обычно представлены в форме последовательности слов и чисел.
Таким образом программа может изменить форму другой программы тем самым изменив её содержание, или может изменить форму другой программы не меняя её содержания. В этом состоит суть макропрограммирования.
В рамках одного языка преимущества и недостатки макропрограммирования заключаются в повышении разнообразия форм которые могут принимать программы написанные на этом языке.
Что касается дебага, то макропрограммирование как таковое не подразумевает дебага вообще. Это всего лишь возможность произвольного преобразование форм программ, ничем не отличающееся от преобразования любых других данных. Преобразование форм программ осуществляется самыми обычными средствами, например обычными функциями высшего порядка, поэтому сложность дебага при таком раскладе сводится к сложности дебага программы составленной из функций высшего порядка.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы