It is possible to defer the processing of a lexical string
operator by using the lexical escape operator, which is the
percent sign (%). Since all lexical string operators begin with
a percent sign, the effect of placing two percent signs before
the name of the lexical string operator defers the evaluation of
the lexical string operator. If you want to defer processing of
a lexical substitution operator, place two percent signs to the
left and two percent signs to the right of the lexical string
symbol name.
This can be useful when you want the evaluation of a lexical
string operator that you have used in a default macro argument
to occur during macro expansion, rather than during macro
definition. Lexical operator processing is suppressed during
macro registration. Therefore, lexical operator processing is
automatically deferred within the body of a macro. However, the
.MACRO directive line that begins the macro definition is subject
to normal lexical operator processing. Sometimes you may need
to use the value of a lexical string symbol as the default for
a macro argument, but you need to use the value of the lexical
string symbol that is current when the macro expands, not when
the macro is defined. Lexical Processing Without the Escape
Operator shows an example of this, but it does not use an escape
operator.
Example 1 Lexical Processing Without the Escape Operator
CODE_PSECT_NAME = "CODE1"
.MACRO CODE_PSECT PSECT_NAME=%string(CODE_PSECT_NAME)
.PSECT PSECT_NAME
.ENDM CODE_PSECT
CODE_PSECT
CODE_PSECT_NAME = "CODE2"
CODE_PSECT
Lexical Processing Without the Escape Operator does not process
correctly for the following reasons:
o The lexical operator in the .MACRO directive line is processed
when the macro is defined, not when the macro expands.
o The CODE_PSECT macro always defaults to setting the psect
to the CODE1 psect because the default for the PSECT_NAME
argument will be set to CODE1, not %string(CODE_PSECT_NAME).
This is because %string(CODE_PSECT_NAME) is evaluated when the
CODE_PSECT macro is defined, not when it expands.
Lexical Processing with Escape Operator is similar to Lexical
Processing Without the Escape Operator except it uses the lexical
escape operator.
Example 2 Lexical Processing with Escape Operator
CODE_PSECT_NAME = "CODE1"
.macro CODE_PSECT PSECT_NAME=%%string(CODE_PSECT_NAME)
.psect PSECT_NAME
.endm CODE_PSECT
CODE_PSECT
CODE_PSECT_NAME = "CODE2"
CODE_PSECT
Lexical Processing with Escape Operator processes correctly for
the following reasons:
o Lexical operator processing of %%string(CODE_PSECT_NAME)
is deferred when the CODE_PSECT macro is defined. The
default value for the PSECT_NAME argument is stored as
%string(CODE_PSECT_NAME).
o During macro expansion, %string(CODE_PSECT_NAME) is evaluated,
which results in the current value of the CODE_PSECT_NAME
lexical string symbol as desired.