マクロプロセッサは、マクロ変数を作成できるマクロプログラムステートメントを実行するときに、使用可能な同じ名前のマクロ変数が存在しなければ、その変数をローカルシンボルテーブルに作成します。次の例について考えてみます。
%let new=inventry;
%macro name2;
%let new=report;
%let old=warehse;
%mend name2;
%name2
data &new;
set &old;
run;
NAME2が実行されると、SASコンパイラはその後のステートメントを次のように解釈します。
data report;
set &old;
run;
マクロNAME2の実行終了後、マクロプロセッサは&OLD参照を検出します。このとき、マクロ変数OLDは存在しません。マクロプロセッサは参照を置換できないため、警告メッセージを発行します。
次の図は、さまざまなステージでのグローバルシンボルテーブルとローカルシンボルテーブルのコンテンツを示しています。
一方、次のプログラムのように、マクロNAME2の内部にSASステートメントを配置したとします。
%let new=inventry;
%macro name2;
%let new=report;
%let old=warehse;
data &new;
set &old;
run;
%mend name2;
%name2
この場合、マクロプロセッサは、NAME2の実行中にSETステートメントを生成するため、NAME2のローカルシンボルテーブルでOLDを検出します。したがって、このマクロを実行すると次のステートメントが生成されます。
data report;
set warehse;
run;
ネストのレベル数に関係なく、同じルールが適用されます。次の例について考えてみます。
%let new=inventry;
%macro conditn;
%let old=sales;
%let cond=cases>0;
%mend conditn;
%macro name3;
%let new=report;
%let old=warehse;
%conditn
data &new;
set &old;
if &cond;
run;
%mend name3;
%name3
マクロプロセッサは、次のステートメントを生成します。
data report;
set sales;
if &cond;
run;
マクロプロセッサが&COND参照に到達する前にCONDITNの実行が終了しているため、マクロプロセッサが&COND参照を置換しようとしたときには、すでにCONDという名前の変数は存在しません。したがって、マクロプロセッサは警告メッセージを発行し、定数テキストの一部として未置換の参照を生成します。次の図に、各ステップでのシンボルテーブルを示します。
マクロ呼び出しの配置は、ネストされたスコープを作成することであって、マクロ定義の配置ではありませんので注意してください。たとえば、NAME3の内部でCONDITNを呼び出すと、ネストされたスコープが作成されます。NAME3の内部でCONDITNを定義する必要はありません。