====== Macros ====== Let's see simple example, without explaining the syntax of macro definition: >(defmacro do3times (a) `(progn ,a ,a ,a nil)) ; special form DEFMACRO defines macro DO3TIMES >(do3times (print "Hello")) ; function PRINT will be called three times "Hello" "Hello" "Hello" NIL When the first symbol ''DO3TIMES'' is recognized as a name of a macro, the form will be treated as macro-expansion form. In principle it means that two-step evaluation will happen. First the non-evaluated argument ''(print "Hello")'' is submitted to the procedure we defined by ''DEFMACRO'' that will decide what to do with it - macro can evaluate, reorder, restructure the forms - and will return new piece of code. In the second step, the code is evaled. The first step is called //macro expansion// and can be examined with a function ''MACROEXPAND'' >(macroexpand '(do3times (print "Hello"))) ; we expand the previously called command (PROGN (PRINT "Hello") (PRINT "Hello") (PRINT "Hello") NIL) ; this is the returned code T