Base SASマクロ

Last-modified: 2012-12-20 (木) 18:59:37

マクロ機能

Base SASプロダクトに含まれる機能で、プログラムのモジュール化やアプリケーション開発に威力を
発揮します。
DATAステップやPROCステップの上位に位置する機能で、通常のSASステートメントより前に解釈
実行されます。
マクロ機能はプログラミング言語仕様を持つマクロ言語とマクロ言語で書かれたSASコード部分を解釈実行するマ
クロプロセサの2つの要素で構成されます。主なマクロ機能として、マクロ定義(マクロ保存、マクロ呼出しを含む)、グローバルマクロ変数、自動マクロ変数、DATAステップとのインターフェースなどがあります。

 

マクロの利点

マクロの利用により、以下のようなプログラムコーディング上のメリットが得られます。

 
  • 同じ処理を繰り返し行う場合のコーディングの簡素化
  • 再帰処理
  • 処理のモジュール化
  • アプリケーション作成
     

同じ処理を繰り返し行う場合のコーディングの簡素化

例として、先頭の1文字”D”に続いて”YYYYMM”形式の6桁の年月で名づけられている一連のSASデータセット
(例えば”D200104”から”D200203”までの12個のデータセット)に対して日付順に並べるという同じ処理を
行います。処理したいデータセットの最初の年月と最後の年月の2つをパラメータとして指定するようにします。

構文例(日付が名前の一部となっている連続年月データセットに対するsort)

%macro sortdata(fro_yymm,to_yymm);      %* マクロ sortdata の定義 パラメータはデータセット名に含まれる
                       &fro_yymm,&to_yymm の2つ ;
  %do year=%substr(&fro_yymm,1,4) %to %substr(&to_yymm,1,4);    %* YYYY部分のループ ;
    %do month=1 %to 12;                                         %* MM部分のループ ;
      %if &month<=9 %then %let month2=0&month;                %* MMが1~9の場合はその前に0を付ける ;
      %else %let month2=&month;                                 %* MMが10~12の場合はそのまま ;
      %if &year.&month2>=&fro_yymm and &year.&month2<=&to_yymm %then %do;
                 %* 生成したYYYYMMの値がパラメータの指定範囲にあるかどうかチェック ;
        proc sort data=D&year.&month2 out=E&year.&month2;by date;run;
      %end;                                                     %* %if 文に対応 ;
    %end;                                                       %* %do 文に対応 ;
  %end;                                                         %* %do 文に対応 ;
%mend sortdata;                                                 %* マクロ sortdata 定義の終了 ;

実行例

options mprint;                         %* マクロ実行時に展開されたSASコードをログに書き出すよう指定 ;
%sortdata(200104,200203)                %* sortdataマクロの呼び出し ;

実行結果

パラメータで指定した2001年4月から2002年3月までの12個のデータセットを
日付で並べ替えるPROC SORT処理が生成され、実行されます。

MPRINT(SORTDATA):  proc sort data=D200104 out=E200104; by date;run;
MPRINT(SORTDATA):  proc sort data=D200105 out=E200105; by date;run;
MPRINT(SORTDATA):  proc sort data=D200106 out=E200106; by date;run;
MPRINT(SORTDATA):  proc sort data=D200107 out=E200107; by date;run;
MPRINT(SORTDATA):  proc sort data=D200108 out=E200108; by date;run;
MPRINT(SORTDATA):  proc sort data=D200109 out=E200109; by date;run;
MPRINT(SORTDATA):  proc sort data=D200110 out=E200110; by date;run;
MPRINT(SORTDATA):  proc sort data=D200111 out=E200111; by date;run;
MPRINT(SORTDATA):  proc sort data=D200112 out=E200112; by date;run;
MPRINT(SORTDATA):  proc sort data=D200201 out=E200201; by date;run;
MPRINT(SORTDATA):  proc sort data=D200202 out=E200202; by date;run;
MPRINT(SORTDATA):  proc sort data=D200203 out=E200203; by date;run;
 

再帰処理

マクロ定義の中に自分自身を呼出す処理を書くことができます。
これを再帰呼び出しと呼びます。ハノイの塔の問題を解くプログラムを例示します。
(ハノイの塔の問題とは、3本の棒A,B,Cがあり、n個の大きさの異なる円盤が大きさの順に
 すべてAに積まれている状態から始めて、最終的にすべての円盤をBに移動させる問題です。
 ただし、一度に移動できる円盤は1個のみで、円盤の大小関係を逆にして棒に積むことはできません。)

構文例(ハノイの塔の問題を解く)


%* マクロ hanoi の定義(&n個の円盤を&Aから&Bに移動する手順)パラメータは&n(円盤の数)
  と3本の棒を表す&A,&B,&C ;
%macro hanoi(n,A,B,C);
  %if &n=1 %then %do;
    %let no=%eval(&no+1);
    %put %str(手順&no: 円盤 D1 を &A から &B に移動せよ);
  %end;
  %else %do;
    %hanoi(%eval(&n-1),&A,&C,&B); %* (&n-1)個の円盤について&Aから&Cに移動する手順を呼び出す ;
    %let no=%eval(&no+1);
    %put %str(手順&no: 円盤 D&n を &A から &B に移動せよ);  %* &n番目の円盤を&Aから&Bに移動する ;
    %hanoi(%eval(&n-1),&C,&B,&A); %* (&n-1)個の円盤について&Cから&Bに移動する手順を呼出す ;
  %end;
%mend hanoi;                      %* マクロ hanoi 定義の終了 ;

実行例

%let no=0;           /* 手順番号をリセット */
%hanoi(3,A,B,C)      /* n=3の場合のハノイの塔の問題を解く */

実行結果

手順1: 円盤 D1 を A から B に移動せよ
手順2: 円盤 D2 を A から C に移動せよ
手順3: 円盤 D1 を B から C に移動せよ
手順4: 円盤 D3 を A から B に移動せよ
手順5: 円盤 D1 を C から A に移動せよ
手順6: 円盤 D2 を C から B に移動せよ
手順7: 円盤 D1 を A から B に移動せよ
 

処理のモジュール化

SASデータセットのオブザベーション数や、変数の数、そしてすべての変数の名前、型、ラベルを取り出す処理は
アプリケーション開発の際、比較的頻繁に行われる処理です。そこで、これらの処理をマクロでモジュール化して
おくと便利です。

構文例1(オブザベーション数を取り出すルーティンのモジュール化)

%macro nobs(dataset);
  %global nobs;                %* マクロ定義の外でも参照可能なグローバルマクロ変数 nobs を宣言する ;
  data _null_;                 %* オブザベーション数を取り出すプログラム(他の方法もある) ;
    nobs=%sysfunc(attrn(%sysfunc(open(&dataset,i)),NOBS));
    call symput("NOBS",left(put(nobs,12.)));      %* マクロ変数 nobs に結果を格納する ;
  run;
%mend nobs;

構文例2(変数情報を取り出すルーティンのモジュール化)

%macro varinfo(dataset);
  %global nvars;               %* 結果を格納するマクロ変数のグローバル宣言 ;
  data _null_;                 %* 変数の数を取り出すプログラム(他の方法もある) ;
    varnum=%sysfunc(attrn(%sysfunc(open(&dataset,i)),NVARS));
    call symput("NVARS",left(put(varnum,12.)));  %* マクロ変数 nvars に結果を格納する ;
  run;
  %do i=1 %to &nvars;
    %global varname&i;         %* 結果を格納するマクロ変数のグローバル宣言 ;
    %global vartype&i;         %* 結果を格納するマクロ変数のグローバル宣言 ;
    %global varlen&i;          %* 結果を格納するマクロ変数のグローバル宣言 ;
    %global varlabel&i;        %* 結果を格納するマクロ変数のグローバル宣言 ;
  %end;
  data _null_;                 /* 変数情報を取り出す */
    length varname_num $19;    /* varname1,varname2,  ...を値に持つ変数 */
    length vartype_num $19;    /* vartype1,vartype2,  ...を値に持つ変数 */
    length varlen_num $18;     /* varlen1,varlen2,    ...を値に持つ変数 */
    length varlabel_num $20;   /* varlabel1,varlabel2,...を値に持つ変数 */
    dsid=%sysfunc(open(&dataset,i));
    do i=1 to &nvars;
      varname_num=compress("VARNAME"||put(i,12.));
      vartype_num=compress("VARTYPE"||put(i,12.));
      varlen_num=compress("VARLEN"||put(i,12.));
      varlabel_num=compress("VARLABEL"||put(i,12.));
      varname=varname(dsid,i);  /* i番目の変数の名前を取り出す   */
      vartype=vartype(dsid,i);  /* i番目の変数の型を取り出す     */
      varlen=varlen(dsid,i);    /* i番目の変数の長さを取り出す   */
      varlabel=varlabel(dsid,i);/* i番目の変数のラベルを取り出す */
      call symput(varname_num,compress(varname));  /* マクロ変数に格納 */
      call symput(vartype_num,compress(vartype));  /* マクロ変数に格納 */
      call symput(varlen_num,compress(varlen));    /* マクロ変数に格納 */
      call symput(varlabel_num,compbl(varlabel));  /* マクロ変数に格納 */
    end;
  run;
  %put %str(nvars=&nvars);     %* 確認 ;
  %do i=1 %to &nvars;
    %put %str(varname&i=&&varname&i);
    %put %str(vartype&i=&&vartype&i);
    %put %str(varlen&i=&&varlen&i);
    %put %str(varlabel&i=&&varlabel&i);
  %end;
%mend varinfo;

実行例1

data samp;
  do x=1 to 10;
    y=uniform(1);
    output;
  end;
  label y="一様乱数";
run;
%nobs(samp)                 /* マクロ nobs の呼び出し */
%put &NOBS;                 /* マクロ変数 nobs の値を確認する */

実行結果1

10

実行例2

%varinfo(samp)              /* マクロ varinfo の呼び出し */

実行結果2

nvars=2
varname1=x, vartype1=N, varlen1=8, varlabel1=
varname2=y, vartype2=N, varlen2=8, varlabel2=一様乱数
 

アプリケーション作成

線形回帰分析を行うSASプロシジャの中には、今のところ、分類説明変数と数値説明変数混在の場合の変数選択機能を有したものが無いようなので、
ここでは、回帰分析モデルの説明変数として、分類変数と数値変数が混在した場合の変数選択を実行するマクロプログラムを例示します。ただし、実際
のプログラムには、入力パラメータの有効性(データセットや変数が存在するか否か、目的変数と説明変数の指定に矛盾がないかといったこと)などを
チェックする前処理ルーティンが必要と思いますが、ここでは省いています。入力パラメータとして、data=分析データセット、y=目的変数名、class=
分類説明変数リスト、x=数値説明変数リスト、outest=パラメータ出力先データセット、sle=モデルに追加する変数の有意確率、sls=モデルから除外
する変数の有意確率、があります。

処理の概要

まず、glmmodプロシジャを用いて、分類説明変数リストからデザイン行列を作成し、デザイン行列の各列(ダミー変数)の名前を
「分類変数名+”_”+カテゴリ値」に改名します。(ただし、これらの名前はSAS変数名として有効な文字と長さを持つものとします。)
次に、このデザイン行列データセットと元の分析データセットをマージし、次のregプロッシジャの入力とします。最後に、regプロシジ
ャのmodelステートメントに指定する説明変数リストにおいて、個々の分類変数に関連するダミー変数セットごとに「グループ変数」
指定を行うことにより、分類説明変数を含むステップワイズ回帰分析を行うようにしています。

構文例(分類説明変数を含むステップワイズ回帰分析)

%macro stepwise(data=,y=,class=,x=,outest=est,sle=0.15,sls=0.15);
  %do i=1 %to 10000;         %* class指定変数の名前と数 ;
    %let class&i=%scan(%upcase(&class),&i);
    %if &&class&i=%str() %then %goto skip;
  %end;
  %skip:
  %let class_n=%eval(&i-1);  %* classに指定された変数の数 ;
  %* 分類変数のデザイン行列化 ;
  proc glmmod data=&data noprint outparm=parm outdesign=design;
    class &class;
    model &y=&class;
  run;
  %* parmデータセットから変数名"coln"を"変数名_カテゴリ値"に変更 ;
  data _null_;
    set parm end=e1;
    *file log;
    effname=upcase(effname);
    if effname="INTERCEPT" then do;oldname="COL1";text="COL1=INTERCEPT";end;
    else do;
      oldname=compress("COL"||put(_colnum_,5.));
      %do i=1 %to &class_n;
        if effname="&&class&i" then text=compress(oldname||"="||effname||"_"||&&class&i);
      %end;
    end;
    call symput(oldname,text);
    if e1 then call symput("col_n",compress(put(_colnum_,5.)));
  run;
  proc datasets nolist;
    modify design;
    rename
    %do i=1 %to &col_n;
      %str( &&col&i )
    %end;
    ;
  run;
  %* デザイン行列変数と元の変数をマージ ;
  data newdata;
    merge &data design;
  run;
  %* 分類変数を含む変数選択回帰モデル ;
  proc reg data=newdata outest=&outest;
    model &y=&x
      %do i=1 %to &class_n;
        %str( {&&class&i.._:} )
      %end;
      /selection=stepwise sle=&sle sls=&sls;
  run;quit;
%mend;

実行例

%stepwise(data=sasuser.class,y=height,class=sex,x=age weight);
 

マクロの保存

マクロを定義したソースコードをマクロ自動呼出しライブラリ(MACAUTOS)に保存しておくと、SAS起動時から呼出し可能な状態にすることができます。
(この場合は呼出し時に、一度だけマクロ定義のコンパイル処理が行われます。)また、マクロ定義時に、オプション指定(%MACROステートメントの
STOREオプション)を行っておくと、コンパイル済みのマクロ定義をユーザライブラリに保存しておくこともできます。(ただし、保存先はシステムオプシ
ョン(SASMSTORED=)で事前に指定しておく必要があります。)後者の方法は、マクロプログラムをソースコード抜きで、他の人に提供するような場
合に適しています。

構文例(コンパイル済みのマクロ定義をSTOREオプションを指定して保存する)

libname mstore "C:\MSTORED";       /* SASカタログ保存先 */
options mstored sasmstore=mstore;  /* コンパイル済みマクロ保存機能を有効にするオプション */
%macro nobs(dataset)/store;        %* store オプションを指定 *;
  %global nobs;
  data _null_;
    nobs=%sysfunc(attrn(%sysfunc(open(&dataset,i)),NOBS));
    call symput("NOBS",left(put(nobs,12.)));
  run;
%mend nobs;

Plugin pre: Usage:
#pre[([number|nonumber])]{{
ソースコード
}}

マクロ言語

マクロ言語はコンパイラであり、DATAステップと同じようなキーワードを持つコントロールステートメント、関数、演算子その他の文法を持っています。
マクロ言語のステートメントや関数の名前は%記号で始まり、マクロ変数の名前は&記号で始まるという決まりがあります。(ただし、%INCLUDEと
%RUNの2つのステートメントは例外で、マクロプロセサはこの2つのステートメントには関与しません。)
マクロ言語は、マクロステートメント、マクロ関数、マクロ変数、自動マクロ変数、DATAステップとのインターフェースなどから構成されています。

マクロ定義

マクロ定義は、SAS環境下でプログラムのモジュール化を実現する機能です。これは%MACROステートメントと%MENDステートメントで囲まれた
範囲にユーザ独自の処理をマクロ言語で記述しておくものです。マクロ定義の中では、入力されたデータセットの名前や、途中で計算された変数の
集計値、その他によって、その後の処理の流れを変更するなどの複雑な処理を、事前に自由に定義しておくことができます。定義されたマクロは、
マクロ定義の中で用いられているいくつかのマクロ変数(マクロパラメータ、またはローカルマクロ変数と呼ばれる)に値を与えた上で、定義された
マクロ名で呼出すことができます。シンプルなマクロ呼出し命令によってモジュール化された一連の処理を実行させることができるため、マクロ定義
機能は大変便利な機能です。

指定方法

%MACRO マクロ名(パラメータリスト)/オプション;
処理ステートメント;
...
%MEND マクロ名;

パラメータリストは、マクロを呼出すときに値を与えるべきローカルマクロ変数の名前を指定するものです。
パラメータリストの指定方法は、呼出し方に関連して2通りあります。

  • 方法1
    パラメータとして定義するローカルマクロ変数名をカンマで区切ってリスト指定する方法(定位置パラメータと呼ばれます)
    例:%macro x(a,b,c);
    ローカルマクロ変数&a,&b,&cの3つをパラメータとして持つマクロxを定義しています。この場合の呼出し命令は、
    %x(june,july,aug)
    というように、%マクロ名に続いて()の中にパラメータの定義順に値を与えた上で、マクロを呼出す決まりです。
    上記の呼出し命令は、マクロ変数&a,&b,&cそれぞれにjune,july,augという値を与えてマクロxを呼出す命令だと
    マクロプロセサに解釈されます。
  • 方法2
    パラメータ名=初期値という形式で必要な数のパラメータを定義する方法(キーワードパラメータと呼ばれます)
    例:%macro x(a=,b=,c=aug);
    方法1と同様に、ローカルマクロ変数&a,&b,&cの3つがパラメータであることを示しています。ただし、初期値として
    &a,&bの2つにはヌル値、&cにはaugという値を与えています。この場合の呼出し命令は、
    %x(b=july,a=june)
    というように、%マクロ名に続いて()の中にパラメータの値を、ローカル変数名=値、の形式で与えた上で、
    マクロを呼出す決まりです。なお、キーワードパラメータ指定形式の場合は、パラメータの指定順は任意で
    かまいません。また、マクロ定義時に初期値が与えられているパラメータについては、呼出し時に省略可能
    です。上記の例では、パラメータ&cには初期値augが与えられていたため、呼出し時に指定を省略しても問題
    ありません。
     
    オプションには以下のものがあります。
    CMD
    通常のネームスタイルマクロ呼び出しに加えて、コマンドスタイルマクロ呼び出しを利用できるようにします。
    CMDMACシステムオプションが有効になっている必要があります。
    DES=”テキスト”
    半角で40文字までの説明テキストを、マクロカタログエントリに付けることができます。
    PARMBUFF
    PBUFF
    このオプションは、パラメータリストの数があらかじめ定まっていず、呼出し時に指定されることを想定した
    マクロ処理をプログラミングするときに用います。呼出し時に指定されるパラメータは、自動マクロ変数&SYS
    BUFFに入力されていると仮定してプログラミングを行います。
    STMT
    通常の%マクロ名の形式(ネームスタイルと呼ばれます)のマクロ呼出しに加えて、ステートメントスタイルマ
    クロ呼出しを利用できるようにします。IMPLMACシステムオプションが有効になっている必要があります。
    SOURCE
    SRC
    コンパイルされたマクロとソースコードを一緒に保存したい場合に指定します。このオプションは次のSTOR
    Eオプションと共に指定される必要があり、さらにMSTOREDシステムオプションが有効になっている必要があり
    ます。
    STORE
    コンパイルされたマクロをSASMSTORE= システムオプションで指定した永久SASデータライブラリ内のSASカ
    タログのエントリとして保存します。MSTOREDシステムオプションが有効になっている必要があります。

簡単な例

%MACRO join(indata1=,indata2=,outdata=,way=set,key=);
  data &outdata;
    &way &indata1 &indata2;
    %if &key ne %str() %then %do;
      by &key;
    %end;
  run;
%MEND join;

マクロjoinの入力パラメータ(呼出すときに値を与えておかなければならないマクロ定義中に用いられているローカルマクロ変数)
はindata1,indata2,outdata,way,keyの5個。
マクロjoinは次にような処理を定義している。2つの入力データセット(&indata1,&indata2)を縦または横に連結(setまたは
mergeのいずれかの値をとるパラメータ&way)し、出力データセット(&outdata)を作成する。パラメータ&keyは2つの入力
データセットに共通に存在するキー変数名(&key)を指定するオプションパラメータであり、ヌル値以外を指定した場合はその変
数を指定したbyステートメントを生成する。

呼び出し例1

%join(indata1=a,indata2=b,outdata=c,way=merge,key=id)

上記ステートメントはマクロjoinを5個のパラメータの値とともに呼出しています。なお、マクロ呼出しには末尾のセミコロン(;)は、
文法的には付けるべきではないことに注意。(付けた場合は展開されたSASコードにセミコロン(;)がテキストとして追加された形で
DATAステップまたはPROCステップコンパイラに引渡されます。)

呼び出し例1によるSASコードへの展開結果

data c;
  merge a b;
  by id;
run;

呼び出し例2

%join(indata1=june_sales,indata2=july_sales,outdata=tot_sales)

呼び出し例2によるSASコードへの展開結果

data tot_sales;
  set june_sales july_sales;
run;

マクロ定義において、wayパラメータには初期値としてway=setを指定していたので、呼出しの際に指定が無いパラメータwayには
この初期値が使われます。

 

マクロステートメント

以下の25個のマクロステートメントがマクロ言語として用意されています。これらはすべてマクロ定義の中ですべて使うことができます。
この中で以下の13個のステートメントはマクロ定義の外でも使うことができます。

%*コメント, %COPY, %DISPLAY, %GLOBAL, %INPUT, %LET, %PUT, %SYMDEL,
%SYSCALL,%SYSEXEC, %SYSLPUT, %SYSRPUT, %WINDOW
%*コメント	コメント指定
%ABORT	実行中のDATAステップ、SASジョブ、SASセッションと共にマクロの実行を中断する
%COPY	SASライブラリからアイテムをコピー
%DISPLAY	%WINDOWステートメントで定義したキャラクタベース情報ウィンドウを表示する
%DO 繰り返し  インデックスマクロ変数値の値に基づきステートメントを繰り返し実行する
%DO %UNTIL	条件が真になるまでステートメントを繰り返し実行する
%DO %WHILE	条件が真である間はステートメントを繰り返し実行する
%END	%DOループの終了
%GLOBAL	SASセッション中有効なマクロ変数を作成する
%GOTO ラベル	指定するラベルに分岐する
%IF~%THEN~%ELSE	条件によって処理するマクロ部分を指定する
%INPUT	マクロ実行中にマクロ変数に値を与える
%ラベル:	%GOTOステートメントの分岐先の位置を示す
%LET	マクロ変数を作成し値を与える
%LOCAL	マクロ定義の中だけで有効なマクロ変数を作成する
%MACRO	マクロ定義の開始を宣言する
%MEND	マクロ定義の終了を宣言する
%PUT	テキストまたはマクロ変数の値をSASログ上に書き出す
%RETURN	現在実行中のマクロを正常終了させる
%SYMDEL	指定した名前のマクロ変数を削除する
%SYSCALL	SASのCALLルーティンを呼び出す
%SYSEXEC	OSコマンドを発行する
%SYSLPUT	リモートホストまたはサーバ上の新しいマクロ変数を定義するか既存のマクロ変数
     の値を修正する
%SYSRPUT	リモートホスト上のマクロ変数値をローカルホスト上のマクロ変数に割り当てる
%WINDOW	キャラクタベースの情報表示ウィンドウを定義する

最も良く使うステートメントは%LETステートメントです。これはマクロ定義の外で使うと
必ずグローバルマクロ変数を定義することになり、マクロ定義の中で%GLOBALステ
ートメントで宣言せずに使うとマクロ定義実行範囲内だけで値が有効(参照や変更可能と
いうこと)なローカルマクロ変数を定義することになります。

 

マクロ関数

マクロ関数はすべてマクロ定義の内外で使用可能です。マクロ関数はマクロ文字関数、マクロ評価関数、マクロ引用関数、その他の
マクロ関数の4つのカテゴリに分類されています。

マクロ文字関数

%INDEX	文字列の最初の位置を返す
%LENGTH	文字列の長さを返す
%SCAN	指定する区切り文字で区切られた指定番目の部分文字列を取り出す
%QSCAN	%SCANと類似。特殊文字(;”%&など)と演算子コード(AND,OR,EQ,LT,LEなど)をマスクする(役割を無効
     にするという意味)点が異なる
%SUBSTR	指定した位置から指定する文字分の部分文字列を取り出す
%QSUBSTR	%SUBSTRと類似。特殊文字(;”%&など)と演算子コード(AND,OR,EQ,LT,LEなど)をマスクする点が異なる
%UPCASE	文字列を大文字変換する
%QUPCASE	%UPCAESと類似。特殊文字(;”%&など)と演算子コード(AND,OR,EQ,LT,LEなど)をマスクする点が異なる

マクロ評価関数

マクロの世界では基本的にデータの型はテキスト(文字)タイプのみで、数値タイプの値というものは存在しません。
%EVAL関数は引数の中の0-9の数字と+-*/の加減乗除記号などで構成された文字列に対して疑似的数値演算
(整数部分のみを返します)を行い結果を0-9とマイナス記号文字列として返します。
一方、%SYSEVALF関数は浮動小数点演算を行い、結果を小数点込みの文字列で返します。

%EVAL	数値演算や論理演算の結果を返す。ただし、数値演算は途中結果を含めてすべて整数値に
     切り捨てた上で行う
%SYSEVALF	%EVALと類似。浮動小数点演算を行い結果も小数表現などで返す点が異なる

マクロ引用関数

このカテゴリのマクロ関数は非常にややこしいので注意。これらが自由に使いこなせるようになったなら、あなたは立派なマクロマスターです。

%BQUOTE	展開された値の中に含まれる%と&を除く特殊文字(;”+<など)と演算子コード(AND,OR,EQ,LT,LEなど)を
     マクロ実行時にマスクする(特殊文字や演算子コードの本来持つ役割を無効にするという意味)
%NRBQUOTE	%BQUOTEと類似。マスクする対象に%,&の特殊文字も含む点に違いがある
%QUOTE	%BQUOTEと類似。引用符('または”)と括弧(( ))が対でない場合は%記号を前に付加しておかなければ
     ならない点が異なる
%NRQUOTE	%QUOTEと類似。マスクする対象に%,&の特殊文字も含む点に違いがある
%STR	展開前のテキストの中に含まれる%と&を除く特殊文字(;”+<など)と演算子コード(AND,OR,EQ,LT,LEなど)
     をマクロコンパイル時にマスクする
%NRSTR	%STRと類似。マスクする対象に%,&の特殊文字も含む点に違いがある
%SUPERQ	引数に与える文字列をマクロ変数名とみなし、1回だけ展開した値を返す
%UNQUOTE	引数に含まれるすべての特殊文字と演算子コードをマスクしない

その他のマクロ関数

%SYMEXIST	そのマクロ変数が存在するか否かを返す
%SYMGLOBAL	そのマクロ変数がグローバルマクロ変数か否かを返す
%SYMLOCAL	そのマクロ変数がローカルマクロ変数か否かを返す
%SYSFUNC	DATAステップ関数やSCL関数をマクロ環境下で使う
%QSYSFUNC	%SYSFUNCと類似。呼び出す関数の引数にマスクしたい特殊文字(;”%&など)や
     演算子コード(AND,OR,EQ,LT,LEなど)を含む場合に用いる
%SYSGET	ホスト情報を読み取る
%SYSPROD	SASプロダクトのライセンス情報を取得する
*質問・意見