特殊記号を含む文字列を使ったマクロ変数の作成

[OS] ALL
[リリース] ALL
[キーワード] macro, spacial character, quote, %NRSTR

[質問]

「&」や「%」を含む文字列を使ってマクロ変数を作成するには、どのようにすればよいですか。

[回答]

マクロは、プログラムテキストを「トークン」と呼ばれる単位に分解する「ワードスキャナ」を通して、コンパイルされます。

トークンは、ワードスキャナが他のトークンの先頭、トークン後のブランクを検出すると終了します。

「&」や「%」は、このトークンの1種類である特殊文字であり、コンパイラにとって意味のある文字です。
このような、マクロにおいて構文的に意味の記号を単なるテキストとして扱うためには文字列を引用符で囲むクォート処理を行なう必要があります。

クォート処理を行なうマクロ引用符関数はいくつかありますが、ここでは展開前の引数をクォートする%NRSTRマクロ引用符関数を紹介します。

%STR関数は、以下の特殊記号をクォートします。


    +  -  *  /  <  >  =  ¬  ^  ~  ;  ,  blank

    AND  OR  NOT  EQ  NE  LE  LT  GE  GT

また、対象となる記号の前に%記号をつけることにより、以下の記号もクォートします。


    ’  ”  (  ) 

%NRSTR関数は、上記特殊記号に加え、&や%記号についてもクォートします。
%NRSTR関数を使用したいくつかのサンプルパターンを記載しますので、参考にしてください。

例:%NRSTRマクロ引用符関数を使用したパターン例


  %LET text1 = %NRSTR(M & A) ;          /* テキストの全てをクォート */
  %LET text2 = M %NRSTR(&) A ;               /* &記号のみをクォート */
  %LET an     = %NRSTR(&)    ;            /* 事前に &記号をクォート */
  %LET text3 = M &an A       ;     /* 事前にクォートされた値を用いる */

  %PUT text1=&text1 text2=&text2 text3=&text3 ;        /* 結果確認 */

例を実行した結果は次のようになります。


  text1=M & A text2=M & A text3=M & A