Macro Quoting |
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 Character | Must Be Masked | Quoted by All Macro Quoting Functions? | Remarks |
---|---|---|---|
+-*/<>=^|¬ ~ # 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 | yes | AND, OR, IN, and NOT need to be masked because they are interpreted as mnemonic operators by an %EVAL and by %SYSEVALF. |
blank | to maintain, rather than ignore, a leading, trailing, or isolated blank | yes |
|
; | to prevent a macro program statement from ending prematurely | yes |
|
, (comma) | to prevent it from indicating a new function argument, parameter, or parameter value | yes | |
' " ( ) | if it might be unmatched | no | 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. |
%name &name |
(depends on what the expression might resolve to) | no | %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.
Copyright © 2009 by SAS Institute Inc., Cary, NC, USA. All rights reserved.