(defmacro execute-in-reverse (&body body)
`(progn ,@(reverse body)))
(execute-in-reverse (print "Hi") (print "Middle") (print "Bye"))
Prints... "Bye"
"Middle"
"Hi"
Point: You can do whatever you want with the symbols sent to the macro, whatever their contents. Mahmud's wrapper macro is trivial (it could be done with lambdas). Lisp's macro system allows you to create new syntax, including changes in flow control.But my example is trivial, too. I could go on to swap individual parts of my forms around, remap them to other forms depending on various conditions, etc.
In addition, people often talk about Lisp macros, but they neglect to mention the power of reader macros, which allow you to go beyond Lisp's basic AST look-and-feel.