Macro are syntax based. Correctness of types is checked after expansion.
They should be iterative like in CL:
- the expanded code can contain other macro
- produced macro can be expanded
In Lisp, everything can be a macro, so:
- the evaluation order of macro params is not determined, and it depends from the macro
- the code can follow different paradigms
- the semantic of the code depends from the macro, and there is only a weak common syntax structure joining all
The syntax of Lisp is macro and DSL friendly, because it uses the space as separator of expressions. Hence, many different syntaxes can be expressed, like
(f :: Int -> Int).