他のマクロ内でマクロ定義ネストすることは、通常は必要なく、効率的でもありません。ネストされたマクロ定義を含むマクロを呼び出すと、マクロプロセッサによって、ネストされたマクロ定義がテキストとして生成され、入力スタックに配置されます。次に、そのマクロ定義は、ワードスキャナによってスキャンされ、マクロプロセッサによってコンパイルされます。変更しないマクロの定義をネストしないでください。外側のマクロが実行されるたびに、同じネストされたマクロがマクロプロセッサによってコンパイルされます。
原則としてマクロは、別々に定義する必要があります。マクロのスコープをネストする場合は、マクロ定義ではなく、単にマクロ呼び出しをネストします。
たとえば、次の例では、マクロTITLEのネストされたマクロ定義が、マクロSTATS1に含まれています。
/* Nesting a Macro Definition--INEFFICIENT */
%macro stats1(product,year);
%macro title;
title "Statistics for &product in &year";
%if &year>1929 and &year<1935 %then
%do;
title2 "Some Data Might Be Missing";
%end;
%mend title;
proc means data=products;
where product="&product" and year=&year;
%title
run;
%mend stats1;
%stats1(steel,2002)
%stats1(beef,2000)
%stats1(fiberglass,2001)
マクロSTATS1が呼び出されるたび、マクロプロセッサはマクロTITLEの定義をテキストとして生成し、マクロ定義を認識し、マクロTITLEをコンパイルします。この場合、STATS1は3回呼び出されます。つまり、TITLEマクロが3回コンパイルされます。このマクロのステートメントは数行しかないため、コンパイルに数マイクロ秒しかかかりませんが、ステートメントが数百行になるような大規模なマクロの場合は、かなりの時間がかかります。
TITLEは、STATS1の定義内で呼び出されているため、PRODUCTとYEARの値を使用できます。したがって、これらの値をTITLEのスコープで使用できるようにするために、TITLEの定義をネストする必要はありません。TITLEステートメントの定義に含まれる値が、STATS1の実行中に変化する値に依存していないという理由からも、TITLEの定義のネストは不要です。TITLEステートメントの定義がそのような値に依存している場合でも、定義をネストするのではなく、グローバルマクロ変数を使用することで、変更を反映することができます。
別々に定義されたマクロを、次のプログラムに示します。
/* Separating Macro Definitions--EFFICIENT */
%macro stats2(product,year);
proc means data=products;
where product="&product" and year=&year;
%title
run;
%mend stats2;
%macro title;
title "Statistics for &product in &year";
%if &year>1929 and &year<1935 %then
%do;
title2 "Some Data Might Be Missing";
%end;
%mend title;
%stats2(cotton,1999)
%stats2(brick,2002)
%stats2(lamb,2001)
ここでは、マクロTITLEの定義がマクロSTATS2の定義の外にあるため、TITLEは、STATS2が3回呼び出されても1回しかコンパイルされません。TITLEの呼び出しがSTATS2の定義に含まれているため、この場合もTITLEは、PRODUCTとYEARの値を使用できます。
注: マクロを別々に定義するもう1つの理由は、各マクロを別々のファイルに保存して保守しやすくするためです。