前のページ|次のページ

マクロプロセッサによる論理式の評価方法

論理式での数値オペランドの比較

論理(つまりブール)式は、trueまたはfalseとして評価される値を返します。マクロ言語では、0以外のすべての数値はtrueになり、0の値はfalseになります。
マクロプロセッサは、数値を表すオペランドを含む論理式を評価するときに、その文字を一時的に数値に変換します。マクロプロセッサによって数値オペランドを含む論理式がどのように評価されるかを説明するために、次のマクロ定義について考えます。
%macro compnum(first,second);
   %if &first>&second %then %put &first is greater than &second;
   %else %if &first=&second %then %put &first equals &second;
   %else %put &first is less than &second;
%mend compnum;
次の値を使用して、マクロCOMPNUMを呼び出します。
%compnum(1,2)
%compnum(-1,0)
次の結果がログに表示されます。
1 is less than 2
-1 is less than 0
この結果は、論理式のオペランドが数値として評価されたことを示しています。

浮動小数点値または欠損値の比較

浮動小数点値または欠損値含む論理式を評価するには、%SYSEVALF関数を使用する必要があります。浮動小数点値と欠損値を含む比較を説明するために、渡されたパラメータを%SYSEVALF関数を使用して比較し、その結果をログに出力する次のマクロについて考えます。
%macro compflt(first,second);
   %if %sysevalf(&first>&second) %then %put &first is greater than
&second;
   %else %if  %sysevalf(&first=&second) %then %put &first equals
&second;
   %else %put &first is less than &second;
%mend compflt;
次の値を使用してマクロCOMPFLTを呼び出します。
%compflt (1.2,.9)
%compflt (-.1,.)
%compflt (0,.)
次の値がログに書き込まれます。
1.2 is greater than .9
-.1 is greater than .
0 is greater than .
この結果は、%SYSEVALF関数によって浮動小数点値と欠損値が評価されたことを示しています。

論理式での文字オペランドの比較

マクロプロセッサが論理式をどのように評価するかを説明するために、マクロCOMPCHARについて考えます。呼び出されたマクロCOMPCHARは、パラメータとして渡された値を比較し、その結果をログに出力します。
%macro compchar(first,second);
   %if &first>&second %then %put &first comes after &second;
   %else %put &first comes before &second;
%mend compchar;
次の値を使用して、マクロCOMPCHARを呼び出します。
%compchar(a,b)
%compchar(.,1)
%compchar(Z,E)
次の結果がログに出力されます。
a comes before b
. comes before 1
Z comes after E
マクロプロセッサは、文字オペランドを含む式を評価するときに、ホストオペレーティングシステムの並べ替え順を比較で使用します。これらの例の比較は、EBCDICとASCIIの両方の並べ替え順を使用して動作します。
文字オペランドの特殊ケースとして、数値に見えるがピリオドを含むオペランドがあります。ピリオドを含むオペランドを式で使用した場合、両方のオペランドは文字値として比較されます。これによって、予期しない結果が生じる場合があります。結果について理解し、より良い結果が期待できるようにするために、次の例を参照してください。
次の値を使用して、マクロCOMPNUMを呼び出します。
%compnum(10,2.0)
次の値がログに書き込まれます。
10 is less than 2.0
マクロCOMPNUM内の%IF-THENステートメントは、整数の評価を使用しているため、小数点を含むオペランドを数値に変換しません。オペランドは、ホストの並べ替え順を使用して文字列として比較されます。つまり、最小値から最大値までの値を持つ文字の比較になります。たとえば、小文字は大文字よりも小さい値を持つ場合があり、大文字は数字よりも小さい値を持つ場合があります。
注意:
ホストの並べ替え順によって比較結果が決まります。
複数のオペレーティングシステム上で同じマクロ定義を使用した場合、ホストオペレーティングシステム間で並べ替え順が異なる可能性があるため、比較結果が変わる場合があります。ホスト上での並べ替え順の詳細については、SORT Procedure (Base SASプロシジャガイド)を参照してください。
前のページ|次のページ|ページの先頭へ