%IFマクロプログラミングステートメントにて小数点を含む式を評価する

[OS]ALL
[リリース] 6.09e, 6.12, 8.1, 8.2
[キーワード] macro, %eval, %sysevalf

[質問]

%IFマクロプログラミングステートメントにて、下記のように「2 > 12.0」を比較しています。

  … 中略 … 
    %IF 2 > 12.0 %THEN %DO;
  … 中略 … 

結果には、当然FALSEを期待しているのですが、TRUEになってしまいます。理由と回避方法を教えてください。

[回答]

%IFマクロプログラミングステートメントでは、マクロ式の自動評価が行われるため(暗黙の%EVALマクロ関数を適用)、小数点を含む値が指定されていると、%IFマクロプログラミングステートメントが、マクロ式を文字列と判断します。
そのため、FALSEを期待しているにも関わらず、結果はTRUEになってしまいます。

小数点を含むマクロ式の評価を行う場合には、以下のサンプルプログラム(マクロcheck)のように、%SYSEVALFマクロ関数を明示的に指定する必要があります。

サンプルプログラム

  OPTIONS MLOGIC;
  %MACRO check(fnum,ope,snum);
            /* %sysevalfマクロ関数を使用 */
    %IF %SYSEVALF(&fnum &ope &snum) %THEN 
      %DO; 
        PROC PRINT DATA=sashelp.class;
        RUN;
      %END;
      %ELSE %DO;
        PROC CONTENTS DATA=sashelp.class;
        RUN;
      %END;
  %MEND check;
  %check(2,>,12.0)