Макросы можно использовать для обработки отложенных вычислений, но это только часть этого.Суть макросов в том, что благодаря ним в языке практически ничего не исправлено.
Если программирование похоже на игру с кубиками LEGO, с помощью макросов вы также можете изменить форму кубиков или материал, который они используют.построен с.
Макросы это больше, чем просто отложенная оценка.Это было доступно как fexpr
(предвестник макроса в истории lisp).Макросы - это переписывание программ, где fexpr
- это особый случай ...
В качестве примера рассмотрим, что в свободное время я пишу крошечный компилятор lisp to javascript и изначально (в ядре javascriptУ меня была только лямбда с поддержкой &rest
аргументов.Теперь есть поддержка ключевых слов и аргументов, потому что я переопределил значение лямбды в самом lisp.
Теперь я могу написать:
(defun foo (x y &key (z 12) w) ...)
и вызвать функцию с помощью
(foo 12 34 :w 56)
При выполнении этого вызова в теле функции параметр w
будет привязан к 56, а параметр z
к 12, поскольку он не был передан.Я также получу ошибку во время выполнения, если в функцию передан неподдерживаемый аргумент ключевого слова.Я мог бы даже добавить некоторую поддержку проверки во время компиляции, переопределив, что означает компиляция выражений (т.е. добавив проверки, если «статические» формы вызова функций передают в функции правильные параметры).
Суть в том, что оригинал(ядро) язык вообще не имел поддержки аргументов ключевых слов, и я смог добавить его, используя сам язык.Результат такой же, как если бы он был там с самого начала;это просто часть языка.
Синтаксис важен (даже если технически возможно просто использовать машину Тьюринга).Синтаксис формирует ваши мысли.Макросы (и чтение макросов) дают вам полный контроль над синтаксисом.
Ключевым моментом является то, что код перезаписи кода не использует искаженный тупой язык типа brainf ** k, как метапрограммирование шаблона C ++ (где просто* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * if
- это удивительное достижение), или с еще более тупым механизмом замены, чем "regexp", как препроцессор C.
Код переписывания кода использует тот же самый полноценный (и расширяемый) язык.Это все шутки; -)
Конечно, писать макросы сложнее, чем писать обычный код;но это «существенная сложность» проблемы, а не искусственная сложность, потому что вы вынуждены использовать тупой полуязык, как при метапрограммировании C ++.
Написание макросов сложнее, потому что код сложная вещь, и когдапри написании макросов вы пишете сложные вещи, которые сами создают сложные вещи.Даже не так уж редко подниматься на один уровень выше и писать макросы, генерирующие макросы (вот откуда взялась старая шутка «Я пишу код, пишущий код, за который мне платят»).
Но макроэкономика просто безгранична.