前のページ|次のページ

%SUPERQ関数

%SUPERQの使用

%SUPERQ関数は、引数で指定されたマクロ変数を検索し、いかなる置換の実行も許可せず、そのマクロ変数の値をクォーティングします。この関数は、マクロの実行時に、マクロクォーティングを必要とする可能性のあるすべての項目をマスクします。%SUPERQは、引数に対していかなる置換も試みません。そのためマクロプロセッサは、マクロ変数参照またはマクロ呼び出しが置換されなかったことを示す警告メッセージを発行しません。したがって、プログラムが%NRBQUOTE関数を使用して正しく動作できる場合でも、代わりに%SUPERQ関数を使用すれば、不必要な警告メッセージをSASログから除去できます。%%SUPERQは、アンパサンドを付けないマクロ変数名、またはマクロ変数名を生成するテキスト式のいずれかを、引数で受け取ります。
%SUPERQは、マクロシンボルテーブルからマクロ変数の値を取り出して、即座にその値をクォーティングし、置換で生じたすべての値の置換をマクロプロセッサに実行させないようにします。たとえば、マクロ変数CORPNAMEがSmith&Jonesに置換される場合、%SUPERQを使用することで、マクロプロセッサがさらに&Jonesの置換を試みないようにします。次の%LETステートメントによって、値Smith&Jonesが正常にTESTVARに割り当てられます。
%let testvar=%superq(corpname);

%SUPERQの使用例

次の例は、%SUPERQ関数が2つのマクロ呼び出し(1つは定義済みマクロ、もう1つは未定義のマクロ)にどのように影響を与えるかを示しています。
%window ask
 #5 @5 'Enter two values:'
 #5 @24 val 15 attr=underline;

%macro a;
   %put *** This is a. ***;
%mend a;

%macro test;
   %display ask;
   %put *** %superq(val) ***;    /* Note absence of ampersand */
%mend test; 
マクロTESTを呼び出し、表示されたプロンプトに次のように入力したとします。
%test
Enter the following:  %a %x
この%PUTステートメントは、単に次の行を書き込みます。
*** %a %x ***
マクロAは呼び出されず、%Xが置換されなかったことを示す警告メッセージも発行されません。以降の2つの例で、%SUPERQ関数と他のマクロクォーティングを関数を比較します。

%SUPERQ関数を使用した警告メッセージの回避

%NRBQUOTE関数に関するセクションには、この関数を使用すると、マクロプロセッサが、マクロの実行中に&name%nameのパターンを最初に検出したときに、これらのパターンの置換を試みることが示されています。マクロプロセッサは、これらを置換できなかった場合、その値を後で使用したときにアンパサンドまたはパーセント記号を認識しないようにするために、アンパサンドまたはパーセント記号をクォーティングします。ただし、MERRORオプションまたはSERRORオプションが有効な場合、マクロプロセッサは、参照または呼び出しが置換されなかったことを示す警告メッセージを発行します。
次に示すマクロFIRMS3は、%SUPERQ関数によって不必要な警告メッセージを回避する方法を示しています。
%window ask
    #5 @5 'Enter the name of the company:'
    #5 @37 val 50 attr=underline;

%macro firms3;
    %global code;
    %display ask;
        %let name=%superq(val);
           %if &name ne %then %let code=valid;
           %else %let code=invalid;
           %put *** &name is &code ***;
%mend firms3;

%firms3   
マクロFIRMS3を2回呼び出して、次の会社名を入力したとします。
A&A Autos
Santos&D'Amato
マクロの実行後に、次のメッセージがログに書き込まれます。
***A&A Autos is valid *** *** Santos&D'Amato is valid ***

%SUPERQ関数を使用したマクロキーワードの入力

例として、ユーザーが問題と質問を入力し、それらを別のマクロによって後で印刷できるオンライントレーニングシステムを作成することを考えます。%WINDOWステートメントへのユーザーの入力は、ローカルマクロ変数に割り当てられてからグローバルマクロ変数に割り当てられます。ユーザーは、マクロに関して質問するため、問題の例に従うすべての種類のマクロ変数参照およびマクロ呼び出しだけでなく、マークが付いていない不一致の引用符およびかっこを入力する可能性があります。%BQUOTEを使用して入力をマスクした場合は、いくつかの%PUTステートメントを使用して、問題を引き起こす入力についてユーザーに警告しています。%SUPERQ関数を使用すれば、より少ない指示ですみます。マクロASK1とASk2は、マクロクォーティング関数を変更すると、マクロコードがどのように単純化されるかを示しています。
次のマクロASK1に、%BQUOTE関数を使用した場合のマクロコードを示します。
%window ask
    #5 @5 'Describe the problem.'
    #6 @5 'Do not use macro language keywords, macro calls,'
    #7 @5 'or macro variable references.'
    #9 @5 'Enter /// when you are finished.'
   #11 @5 val 100 attr=underline;

%macro ask1;
    %global myprob;
   %local temp;

   %do %until(%bquote(&val) eq %str(///));
       %display ask;
       %let temp=&temp %bquote(&val);
   %end;
    %let myprob=&temp
%mend ask1;
マクロASK1には、一致しない引用符およびかっこに関する警告が含まれていません。次のようにマクロASK1を呼び出し、問題を入力できます。
%ask1

Try entering:
Why did my macro not run when I called it? (It had three
parameters, but I wasn't using any of them.)
It ran after I submitted the next statement.
///
入力の1行目と2行目の両方に、マークが付いていない不一致の引用符とかっこが含まれていることに注目してください。%%BQUOTEは、実行中にこれらの文字を処理できます。
次に示すマクロASK2は、%SUPERQ関数を使用してASK1に変更を加えたものです。ここでは、%WINDOWステートメントはマクロ言語キーワードを受入れ、マクロ呼び出しおよびマクロ変数参照の置換を試みません。
%window ask
    #5 @5 'Describe the problem.'
    #7 @5 'Enter /// when you are finished.'
    #9 @5 val 100 attr=underline;

%macro ask2;
      %global myprob;
      %local temp;

      %do %until(%superq(val) eq %str(///)); /* No ampersand */

          %display ask;
          %let temp=&temp %superq(val);   /* No ampersand */
      %end;
      %let myprob=&temp
%mend ask2;
次のようにマクロASK2を呼び出して、入力できます。
%ask2

Try entering:
My macro ADDRESS starts with %MACRO ADDRESS(COMPANY,
CITY);. I called it with %ADDRESS(SMITH-JONES, INC., BOSTON),
but it said I had too many parameters. What happened?
///
この入力には、マクロ言語キーワード、マクロ呼び出し、および一致しないかっこが含まれています。
前のページ|次のページ|ページの先頭へ