### The Maxima on-line user's manual

Algebra Calculator

#### Macroexpansion

-- Option variable: macroexpansion Default value: `false`

`macroexpansion` controls whether the expansion (that is, the return value) of a macro function is substituted for the macro function call. A substitution may speed up subsequent expression evaluations, at the cost of storing the expansion.

`false` The expansion of a macro function is not substituted for the macro function call.

`expand` The first time a macro function call is evaluated, the expansion is stored. The expansion is not recomputed on subsequent calls; any side effects (such as `print` or assignment to global variables) happen only when the macro function call is first evaluated. Expansion in an expression does not affect other expressions which have the same macro function call.

`displace` The first time a macro function call is evaluated, the expansion is substituted for the call, thus modifying the expression from which the macro function was called. The expansion is not recomputed on subsequent calls; any side effects happen only when the macro function call is first evaluated. Expansion in an expression does not affect other expressions which have the same macro function call.

Examples

When `macroexpansion` is `false`, a macro function is called every time the calling expression is evaluated, and the calling expression is not modified.

```          (%i1) f (x) := h (x) / g (x);
h(x)
(%o1)                     f(x) := ----
g(x)
(%i2) g (x) ::= block (print ("x + 99 is equal to", x),
return (x + 99));
(%o2) g(x) ::= block(print("x + 99 is equal to", x),
return(x + 99))
(%i3) h (x) ::= block (print ("x - 99 is equal to", x),
return (x - 99));
(%o3) h(x) ::= block(print("x - 99 is equal to", x),
return(x - 99))
(%i4) macroexpansion: false;
(%o4)                         false
(%i5) f (a * b);
x - 99 is equal to x
x + 99 is equal to x
a b - 99
(%o5)                       --------
a b + 99
(%i6) dispfun (f);
h(x)
(%t6)                     f(x) := ----
g(x)```

```          (%o6)                         done
(%i7) f (a * b);
x - 99 is equal to x
x + 99 is equal to x
a b - 99
(%o7)                       --------
a b + 99```

When `macroexpansion` is `expand`, a macro function is called once, and the calling expression is not modified.

```          (%i1) f (x) := h (x) / g (x);
h(x)
(%o1)                     f(x) := ----
g(x)
(%i2) g (x) ::= block (print ("x + 99 is equal to", x),
return (x + 99));
(%o2) g(x) ::= block(print("x + 99 is equal to", x),
return(x + 99))
(%i3) h (x) ::= block (print ("x - 99 is equal to", x),
return (x - 99));
(%o3) h(x) ::= block(print("x - 99 is equal to", x),
return(x - 99))
(%i4) macroexpansion: expand;
(%o4)                        expand
(%i5) f (a * b);
x - 99 is equal to x
x + 99 is equal to x
a b - 99
(%o5)                       --------
a b + 99
(%i6) dispfun (f);
h(x)
(%t6)                     f(x) := ----
g(x)```

```          (%o6)                         done
(%i7) f (a * b);
a b - 99
(%o7)                       --------
a b + 99```

When `macroexpansion` is `expand`, a macro function is called once, and the calling expression is modified.

```          (%i1) f (x) := h (x) / g (x);
h(x)
(%o1)                     f(x) := ----
g(x)
(%i2) g (x) ::= block (print ("x + 99 is equal to", x),
return (x + 99));
(%o2) g(x) ::= block(print("x + 99 is equal to", x),
return(x + 99))
(%i3) h (x) ::= block (print ("x - 99 is equal to", x),
return (x - 99));
(%o3) h(x) ::= block(print("x - 99 is equal to", x),
return(x - 99))
(%i4) macroexpansion: displace;
(%o4)                       displace
(%i5) f (a * b);
x - 99 is equal to x
x + 99 is equal to x
a b - 99
(%o5)                       --------
a b + 99
(%i6) dispfun (f);
x - 99
(%t6)                    f(x) := ------
x + 99```

```          (%o6)                         done
(%i7) f (a * b);
a b - 99
(%o7)                       --------
a b + 99```

```(%o1)                                true
(%i2) ```

### Related Examples

##### macroexpansion

? macroexpansion;

Calculate

##### macroexpansion

? macroexpansion;

Calculate