前のページ|次のページ

%EVAL関数

整数演算を使用して、算術演算式や論理式を評価します。

種類: マクロ評価関数
参照項目: %SYSEVALF関数

構文

%EVAL(arithmetic | logical-expression)

詳細

%EVAL関数は、整数演算式または論理式を評価します。%EVAL関数は、呼び出されると、まずその引数を文字値から数式または論理式に変換します。続いて、同関数は評価を実行します。最後に、%EVAL関数は得られた結果を文字値に変換し、その値を返します。
すべてのオペランドが整数に変換できる場合、式は演算式として扱われます。数値に変換できないオペランドが1つでも存在する場合、式は論理式として扱われます。除算の結果が分数になる場合、その結果は整数に切り捨てられます。
論理(つまりブール)式は、trueまたはfalseとして評価される値を返します。マクロ言語では、0以外のすべての数値はtrueになり、0の値はfalseになります。
%EVAL関数は、整数(標準形式または16進形式)を表す演算式でのみオペランドを受け付けます。ピリオド文字を含んでいるオペランドを整数演算式に含めると、エラーが発生します。%EVAL関数の正しい使い方と誤った使い方の例をそれぞれ次に示します。
%let d=%eval(10+20);       /* Correct usage   */
%let d=%eval(10.0+20.0);   /* Incorrect usage */
%EVAL関数はピリオドを含んでいる値を数に変換しないため、これらのオペランドは文字オペランドとして評価されます。%EVAL関数はピリオドを含んでいる値を検出すると、数値オペランドが必要な箇所に文字オペランドが見つかったというエラーメッセージを表示します。
%EVAL関数に文字値を比較する式を指定した場合、お使いの動作環境における並べ替え順を使用して比較が行われます。お使いの動作環境における並べ替え順の詳細については、Base SASプロシジャガイドのThe SORT PROCEDUREを参照してください。
式を評価するマクロ言語の部分(%IFステートメントや%DOステートメントなど)はすべて、%EVAL関数を呼び出すことにより条件を評価します。マクロ式の評価方法の詳細については、マクロ式を参照してください。

比較

%EVAL関数は整数評価を実施します。一方、%SYSEVALF関数は浮動小数点評価を実施します。

例1: 整数演算評価の概要

次のステートメントは、様々なタイプの評価を表しています。
%let a=1+2;
%let b=10*3;
%let c=5/3;
%let eval_a=%eval(&a);
%let eval_b=%eval(&b);
%let eval_c=%eval(&c);
%put &a is &eval_a;
%put &b is &eval_b;
%put &c is &eval_c;
これらのステートメントをサブミットすると、次のメッセージがSASログに書き込まれます。
1+2 is 3 10*3 is 30 5/3 is 1
3番目の%PUTステートメントは、結果が分数となる整数除算を実行した場合、その小数部が%EVALにより破棄されることを示します。

例2: カウンタのインクリメント

次の例に示すマクロTESTは、%EVAL関数を使用して、マクロ変数Iの値を1ずつインクリメントします。また、%DO %WHILEステートメントで%EVAL関数を呼び出すことにより、マクロ変数Iの値がマクロ変数FINISHの値よりも大きいかどうかを評価します。
%macro test(finish);
   %let i=1;
   %do %while (&i<&finish);
      %put the value of i is &i;
      %let i=%eval(&i+1);
   %end;
%mend test;
%test(5)
このプログラムを実行すると、SASログに次のメッセージが書き込まれます。
The value of i is 1 The value of i is 2 The value of i is 3 The value of i is 4

例3: 論理式の評価

マクロCOMPAREは2つの数を比較します。
%macro compare(first,second);
   %if &first>&second %then %put &first > &second;
   %else %if &first=&second %then %put &first = &second;
   %else %put &first<&second;
%mend compare;
%compare(1,2)
%compare(-1,0)
このプログラムを実行すると、SASログに次のメッセージが書き込まれます。
1 < 2 -1 < 0
前のページ|次のページ|ページの先頭へ