Учитывая весь шум, который поднимается вокруг лисповских макросов, вокруг их необычайной мощности и выразительности, я был несколько удивлен довольно уничижительным высказыванием в их адрес, подкрепленным примером:
Yes, there is a macro mechanism in PicoLisp, to build and immediately execute a list of expressions. But it is seldom used. Macros are a kludge. Most things where you need macros in other Lisps are directly expressible as functions in PicoLisp, which (as opposed to macros) can be applied, passed around, and debugged. For example, Common Lisp's DO* macro, written as a function:
(de do* "Args" (bind (mapcar car (car "Args")) (for "A" (car "Args") (set (car "A") (eval (cadr "A"))) ) (until (eval (caadr "Args")) (run (cddr "Args")) (for "A" (car "Args") (and (cddr "A") (set (car "A") (run @))) ) ) (run (cdadr "Args")) ) )
Есть в сети и еще примеры, довольно много, где макросы откровенно отсасывают. Их часто сравнивают с фэкспрами, причем, оказывается, в лисп среде, до появления компиляторов, лисперы действительно считали макросы достаточно слабым и редкоиспользуемым инструментом. Насколько я понимаю, основная претензия к ним, не столько в том, что они громоздки, многословны и невыразительны, хотя это тоже, сколько в том, что они не first-class.
Так может быть легенды о мощности лисповских макросов сильно преувеличены? Может быть, их использование — это, всего лишь, дань моде и вынужденный компромисс между выразительностью языка и возможностью компиляции?