Исходя из моего опыта, макросы производят наилучшее впечатление на людей, когда они видят, как это помогает создавать код, который не может быть создан процедурами или другими конструкциями.Очень часто такие вещи можно описать так:
<common code>
<specific code>
<other common code>
, где <common code>
всегда одинаково.Вот несколько примеров такой схемы:
1.Макрос time
. Код на языке без макросов будет выглядеть примерно так:
int startTime = getCurrentTime();
<actual code>
int endTime = getCurrentTime();
int runningTime = endTime - startTime;
Вы не можете поместить весь общий код в процедуру, поскольку он оборачивает реальный код.(Хорошо, вы можете создать процедуру и передать фактический код в лямбда-функцию, если язык поддерживает это, но это не всегда удобно).
И, как вы, скорее всего, знаете, в Лиспе вы просто создаете макрос time
и передайте ему действительный код:
(time
<actual code>)
2.Транзакции. Попросите Java-программиста написать метод для простого SELECT
с JDBC - это займет 14-17 строк и будет включать в себя код для открытия соединения и транзакции, чтобы закрыть их, несколько вложенных операторов try-catch-finally
и только 1 или2 строки уникального кода.
В Лиспе вы просто пишете макрос with-connection
и уменьшаете код до 2-3 строк.
3.Синхронизация. ОК, Java, C # и большинство современных языков уже имеют операторы для этого, но что делать, если у вашего языка нет такой конструкции?Или если вы хотите ввести новый вид синхронизации, например транзакции на основе STM ?Опять же, вы должны написать отдельный класс для этой задачи и работать с ним вручную, т.е. поместить общий код вокруг каждого оператора, который вы хотите синхронизировать.
Это было всего несколько примеров.Вы можете упомянуть «незабываемые» макросы, такие как with-open
series, которые очищают среду и защищают вас от утечек ресурсов, новые конструктивные макросы, такие как cond
вместо множества if
s, и, конечно же, donне забывайте о ленивых конструкциях, таких как if
, or
и and
, которые не оценивают свои аргументы (в отличие от применения процедуры).
Некоторые программисты могут утверждать, что в их языке есть технология для обработки того или иного случая (ORM, AOP и т. Д.), Но спрашивают их, нужны ли все эти технологии, если бы существовали макросы?
Итак, взяв все это и отвечая на оригинальный вопрос о том, как объяснить макросы.Возьмите любой широко используемый код на Java (C #, C ++ и т. Д.), Преобразуйте его в Lisp, а затем перепишите его как макрос.