KC3 macros are like Common Lisp macros with Elixir pattern-matching and can destructure and return KC3 algorithmic data structures.
Macros are like functions but start with macro instead of fn and their arguments do not get evaluated. However they get pattern matched and the full power of the pattern matcher is available for arguments destructuring. Use a map if you want named arguments. Use a list if you want &rest arguments, use a block if you want a &body argument.
When evaluated, a macro call returns a tag which is in turn evaluated in the calling site lexical environment. This allows for DSLs and custom control structures to be defined in KC3.
Many basic operations in KC3 are defined as macros : error handling, free operations with unwind-protect, graph database operations like Facts.with_macro.