#### 14.2.12 Additional Notes ¶

#### 14.2.12.1 Calling Macros from Macros ¶

If the body of macro A includes a call to macro B, the call can use macro arguments (including `!*`) and macro variables as part of arguments to B. For `!TOKENS` arguments, the argument or variable name counts as one token regardless of the number that it expands into; for `!CHAREND` and `!ENCLOSE` arguments, the delimiters come only from the call, not the expansions; and `!CMDEND` ends at the calling command, not any end of command within an argument or variable.

Macro functions are not supported as part of the arguments in a macro call. To get the same effect, use `!LET` to define a macro variable, then pass the macro variable to the macro.

When macro A calls macro B, the order of their `DEFINE` commands doesn’t matter, as long as macro B has been defined when A is called.

#### 14.2.12.2 Command Terminators ¶

Macros and command terminators require care. Macros honor the syntax differences between interactive and batch syntax (see Syntax Variants), which means that the interpretation of a macro can vary depending on the syntax mode in use. We assume here that interactive mode is in use, in which ‘`.`’ at the end of a line is the primary way to end a command.

The `DEFINE` command needs to end with ‘`.`’ following the `!ENDDEFINE`. The macro body may contain ‘`.`’ if it is intended to expand to whole commands, but using ‘`.`’ within a macro body that expands to just syntax fragments (such as a list of variables) will cause syntax errors.

Macro directives such as `!IF` and `!DO` do not end with ‘`.`’.

#### 14.2.12.3 Expansion Contexts ¶

Macros do not expand within comments, whether introduced within a line by `/*` or as a separate COMMENT or ‘`*`’ commands (see COMMENT). (SPSS does expand macros in COMMENT and ‘`*`’.)

Macros do not expand within quoted strings.

Macros are expanded in the `TITLE` and `SUBTITLE` commands as long as their arguments are not quoted strings.

#### 14.2.12.4 PRESERVE and RESTORE ¶

Some macro bodies might use the SET command to change certain settings. When this is the case, consider using the PRESERVE and RESTORE commands to save and then restore these settings. See PRESERVE and RESTORE.