前のページ|次のページ

マクロクォーティング

特殊文字とニーモニックのマスク

マクロ言語は、文字ベースの言語です。数値として表示される変数でも、通常は文字変数として扱われます(ただし、式の評価中を除きます)。したがって、マクロプロセッサを使用して、あらゆる特殊文字をテキストとして生成できます。ところが、マクロ言語には同じ特殊文字がいくつか含まれているため、頻繁にあいまいさが発生します。マクロプロセッサは、特定の特殊文字(たとえば、セミコロンや%記号)またはニーモニック(たとえば、GEやAND)をテキストとして解釈するのか、それともマクロ言語のシンボルとして解釈するのかを知る必要があります。マクロクォーティング関数は、特殊文字の意味をマスクすることによってこれらのあいまいさを置換し、マクロプロセッサがそれらを誤って解釈しないようにします。
次の特殊文字およびニーモニックは、文字列に現れたときにマスクする必要がある場合があります。
特殊文字とニーモニック
空白
)
=
LT
;
(
|
GE
¬
+
AND
GT
^
OR
IN
~
*
NOT
%
, (カンマ)
/
EQ
&
'
<
NE
#
>
LE

マクロクォーティングの必要性について

マクロクォーティング関数は、特殊文字やニーモニックを、マクロ言語の一部としてではなくテキストとして解釈するようにマクロプロセッサに指示します。マクロクォーティング関数を使用して特殊文字をマスクしないと、マクロプロセッサや、SASのその他の処理で、特殊文字に意図していない意味が与えられる場合があります。文字列に特殊文字やニーモニックが含まれる場合に発生する可能性のあるあいまいさの種類について、次にいくつか例を示します。
  • %signは、マクロSIGNの呼び出しなのか、それとも"パーセント記号"という語句なのか
  • ORは、ニーモニックのブール演算子なのか、それともOregonの略称なのか
  • O'Malleyに含まれる引用符は、一致しない一重引用符なのか、それとも単に名前の一部なのか
  • Boys&Girlsは、マクロ変数&GIRLSへの参照なのか、それとも子供のグループなのか
  • GEは、"以上"を意味するニーモニックなのか、それともGeneral Electricの略称なのか
  • セミコロンが末尾を示すのは、どのステートメントか
  • カンマは、パラメータを区切っているのか、それともいずれかのパラメータの値の一部なのか
マクロクォーティング関数を使用すると、特殊文字やニーモニックをどう解釈すべきかについて、マクロプロセッサに対して明確に指定できます。
ここでは、最も単純なマクロクォーティング関数、%STRの使用例を示します。PROC PRINTステートメントとRUNステートメントを、マクロ変数PRINTに割り当てるとします。次のステートメントは、間違っています。
%let print=proc print; run;;  /* undesirable results */
このコードはあいまいです。PRINTとRUNの後ろのセミコロンは、マクロ変数PRINTの値に含まれているとも解釈できますし、どちらかが%LETステートメントの末尾を示しているとも解釈できます。どう解釈するべきかをマクロプロセッサに指示しないと、PRINTの後ろのセミコロンが、%LETステートメントの末尾として解釈されます。このため、マクロ変数PRINTの値は次のようになります。
proc print
残りの文字(RUN;;)は、単にプログラムの次の部分になります。
あいまいさを避け、PRINTの値を正しく割り当てるには、マクロクォーティング関数%STRを次のように使用してセミコロンをマスクする必要があります。
%let print=%str(proc print; run;);

マクロクォーティング関数の概要

最も一般的に使用されるマクロクォーティング関数は、次のとおりです。
  • %STRおよび%NRSTR
  • %BQUOTEおよび%NRBQUOTE
  • %SUPERQ
対になったマクロクォーティング関数の場合、名前がNRで始まる関数は、NRの付かない関数がマスクする特殊文字のカテゴリに加えて、アンパサンドとパーセント記号に影響を与えます。つまり、NR関数は、マクロおよびマクロ変数の置換を抑制します。どの関数がどれをマスクするかを覚えやすくするために、マクロクォーティング関数名に含まれるNRから、"置換されない(not resolved)"という言葉を連想するようにしてください。つまり、NRの付いた関数を使用すると、マクロおよびマクロ変数は置換されません。
名前にBを含むマクロクォーティング関数は、一致しない引用符およびかっこをマクロクォーティングするのに役立ちます。このBの意味を覚えやすくするために、Bから"単独で(by itself)"を連想するようにしてください。
%SUPERQマクロクォーティング関数は、仲間を持たず、異なる動作をするという点で、他のマクロクォーティング関数とは違っています。詳細については、%SUPERQ関数を参照してください。
また、マクロクォーティング関数は、それらが有効になるタイミングに基づいて、次の2種類に分類できます。
コンパイル関数
オープンコードのマクロプログラムステートメントにおいて、またはマクロのコンパイル(作成)中に、特殊文字をテキストとしてマクロプロセッサに解釈させます。%STR関数と%NRSTR関数は、コンパイル関数です。詳細については、%STR関数と%NRSTR関数を参照してください。
実行関数
マクロ式を置換することによって得られた特殊文字(マクロ変数参照、マクロ呼び出し、%EVAL関数の引数など)を、マクロプロセッサにテキストとして扱わせます。これらは、マクロの実行中、またはオープンコード内のマクロプログラムステートメントの実行中に置換が発生するため、実行関数と呼ばれます。マクロプロセッサは、可能な限り式を置換して、置換できないマクロ変数参照やマクロ呼び出しについては警告メッセージを発行し、その結果をクォーティングします。%BQUOTE関数と%NRBQUOTE関数は、実行関数です。詳細については、%BQUOTE関数と%NRBQUOTE関数を参照してください。
%SUPERQ関数は、引数としてマクロ変数名(またはマクロ変数名を生成するマクロ式)を受け取ります。この関数の引数に、マスク対象の値が格納されたマクロ変数への参照を渡さないでください。つまり、マクロ変数名の前に&を付けないでください。
注: この他に、%QUOTEおよび%NRQUOTETという2つの実行マクロクォーティング関数があります。%QUOTE、%NRQUOTEこれらは、マクロクォーティングに固有の必要性のため、および以前のマクロアプリケーションとの互換性を保つために役立ちます。詳細については、%QUOTE関数と%NRQUOTE関数を参照してください。

特殊文字とニーモニックを含むパラメータを渡す

置換された値に特殊文字が含まれる可能性がある場合、それをマクロプロセッサに渡す最も簡単かつ最良の方法は、マクロ定義で実行マクロクォーティング関数を使用することです。ただし、実行マクロクォーティング関数を使用してマクロを定義していないときに、orのようなパラメータ値を渡す必要があることが判明した場合、マクロ呼び出しで値をマスクすることによって、それを渡すことができます。この処理のロジックは、次のとおりです。
  1. マクロクォーティング関数を使用して特殊文字をマスクすると、その特殊文字は、マクロ機能の内部にある間はマスクされたままになります(ただし、%UNQUOTE関数を使用した場合を除きます)。
  2. マクロプロセッサは、完全なマクロ呼び出しを構築してから、そのマクロの実行を開始します。
  3. したがって、%STR関数を使用して、呼び出しに含まれる値をマスクできます。マクロプロセッサが呼び出しを構築しているときにマスクは不要です。マクロの実行が開始された時点で、値はすでにマクロクォーティング関数によってマスクされています。そのため、マクロの実行中にその値によって問題が発生することはありません。
たとえば、ORDERXというマクロで%BQUOTE関数を使用していないと仮定します。次の呼び出しによって、マクロORDERXに値orを渡すことができます。
%orderx(%str(or))
ただし、マクロクォーティング関数をマクロ定義内に配置しておくと、マクロの呼び出しが非常に簡単になります。
前のページ|次のページ|ページの先頭へ