Macros run very early in the compilers process when there is no information about how the program might execute. The inputs to a macro are, therefore, simply symbols and expressions—the textual tokens that make up a program. Given that a lot of Julia's powers come from its type system, it may be useful to have something such as macros—code that generates code—at a point where the compiler has inferred the types of the variables and function arguments in the program. Generated functions (also sometimes called staged functions) fulfill this need.
Declaring a generated function is simple. Instead of the usual function
keyword, generated functions are declared with the appropriately named @generated function
keyword. This declares a function that can be called normally from any point in the rest of the program.
Generated functions come in two parts, which are related to how they are executed. They are invoked once for each unique type of its arguments...