Once a macro is defined, you can use it any number of times. To use it, call it just like a function, separating the output list (if any) from the input list with a colon :. When the macro is encountered, variables and equations will be made up so that causal tracing will continue to function properly.
|diddle[house] = daddle + SMOOTH(tadum[house],20)|
This uses the SMOOTH macro defined above, and is exactly the same as
|diddle[house] = daddle + smooth tadum[house]|
|smooth tadum[house]=integ( ( tadum[house] - smooth tadum[house] ) / 20|
except that in the case of the macro the name would be #diddle>SMOOTH#[house] instead of smooth tadum[house].Expanded macro variables are always enclosed within the hash sign #. This allows you to recognize immediately that you are dealing with a macro, and prevents conflicts with other variable names.
You can also get internally defined variables out of a macro. For example, here is a macro to calculate add three numbers. Internally we also calculate the min/max of the three numbers we are adding.
:MACRO: add3(val1, val2, val2 : minval, maxval )
|add3 = val1 + val2 + val3|
|minval = min ( val1, min ( val2, val2 ) )|
|maxval = max ( val1, max ( val2, val2 ) )|
:END OF MACRO:
To call the macro,
|total reserve = add3( water reserve lakes, water reserve rivers, water reserve reservoir : min reserve, max reserve)|
|is water low flag = if then else ( min reserve < LOW WARNING LEVEL , 1 , 0 )|
|is water high flag = if then else ( max reserve > HIGH WARNING LEVEL , 1 , 0 )|