Use a macro quoting function any time you want to assign
to a macro variable a special character that could be interpreted
as part of the macro language. The following table describes the special
characters to mask when used as part of a text string and which macro
quoting functions are useful in each situation.
Special Characters and Macro Quoting Guidelines
|
|
Quoted by All Macro
Quoting Functions?
|
|
+-*/<>=^|¬
~ # LE LT EQ NE GE GT AND OR NOT IN
|
To prevent it from being
treated as an operator in the argument of an %EVAL function
|
|
AND, OR, IN, and NOT
need to be masked because they are interpreted as mnemonic operators
by an %EVAL and by %SYSEVALF.
|
|
To maintain, rather
than ignore, a leading, trailing, or isolated blank
|
|
|
|
To prevent a macro program
statement from ending prematurely
|
|
|
|
To prevent it from indicating
a new function argument, parameter, or parameter value
|
|
|
|
|
|
Arguments that might
contain quotation marks and parentheses should be masked with a
macro quoting function so that the macro facility interprets the
single and double quotation marks and parentheses as text rather
than macro language symbols or possibly unmatched quotation marks
or parentheses for the SAS language. With %STR, %NRSTR,
%QUOTE, and %NRQUOTE, unmatched quotation marks and parentheses
must be marked with a % sign. You do not have to mark unmatched
symbols in the arguments of %BQUOTE, %NRBQUOTE, and %SUPERQ.
|
|
(Depends on what the
expression might resolve to)
|
|
%NRSTR, %NRBQUOTE, and
%NRQUOTE mask these patterns. To use %SUPERQ with a macro variable,
omit the ampersand from name.
|
The macro facility allows
you as much flexibility as possible in designing your macros. You
need to mask a special character with a macro quoting function only
when the macro processor would otherwise interpret the special character
as part of the macro language rather than as text. For example, in
this statement you must use a macro quoting function to mask the
first two semicolons to make them part of the text:
%let p=%str(proc print; run;);
However, in the macro
PR, shown here, you do not need to use a macro quoting function to
mask the semicolons after PRINT and RUN:
%macro pr(start);
%if &start=yes %then
%do;
%put proc print requested;
proc print;
run;
%end;
%mend pr;
Because the macro processor
does not expect a semicolon within the %DO group, the semicolons after
PRINT and RUN are not ambiguous, and they are interpreted as text.
Although it is not possible
to give a series of rules that cover every situation, the following
sections describe how to use each macro quoting function.
Summary of Special Characters and Macro Quoting Functions by Item provides a summary of the various characters that might
need masking and of which macro quoting function is useful in each
situation.
Note: You can also perform the
inverse of a macro quoting function — that is, remove the tokenization
provided by macro quoting functions. For an example of when the %UNQUOTE
function is useful, see
Unquoting Text .