1回はマクロクォーティングされた形式、もう1回はクォーティング解除された形式で、値を2回使用する例を次に示します。マクロANALYZEが2つの統計モデルの出力を対話的に比較できるようにするシステムの一部であると仮定します。まず、演算子を入力して、テストする関係(一方の結果が他方よりも大きい、他方と等しいなど)を指定します。マクロANALYZEは次を実行します。
-
マクロクォーティングされた演算子の値をテストして正しく入力されたことを確認
-
クォーティング解除された値を使用して指定された値を比較
-
コメント内の番号と、次のパラグラフを対応付けてください。
%macro analyze(stat);
data _null_;
set out1;
call symput('v1',&stat);
run;
data _null_;
set out2;
call symput('v2',&stat);
run;
%put Preliminary test. Enter the operator.;
%input;
%let op=%bquote(&sysbuffr);
%if &op=%str(=<) %then %let op=%str(<=);
%else %if &op=%str(=>) %then %let op=%str(>=);
%if &v1 %unquote(&op) &v2 %then
%put You might proceed with the analysis.;
%else
%do;
%put &stat from out1 is not &op &stat from out2.;
%put Please check your previous models.;
%end;
%mend analyze;
SYSBUFFRの値を、%BQUOTE関数を使用してマスクします。この関数は、マークが付いていない不一致の引用符やかっこを含む(ただし、アンパサンドとパーセント記号を除く)置換済み項目をマスクします。
%IF条件は、マクロ変数OPの値を文字列と比較して、OPの値に正しい演算子のシンボルが含まれているかどうかを調べます。間違った順序のシンボルが値に含まれている場合、%THENステートメントによって正しく修正されます。マクロクォーティング関数によってマスクされた値はマスクされたままになるため、%IF条件の左側の&OP参照をマスクする必要はありません。
マクロを定義するときに、%IF条件の右側の文字と%LETステートメントの文字の値は見ることができます。そのため、%STR関数を使用してこれらの文字をマスクできます。これらをコンパイル時にマスクしておくと、ANALYZEを実行するたびにマスクするよりも効率的です。
マクロ変数OPの値を%IF条件の演算子として使用するには、%UNQUOTE関数を使用して演算子の意味を復元する必要があります。