%LETでマクロ変数を定義した時に、ローカル・グローバルどちらになるのか説明します。
まずは以下がSAS内部の判定方法なのでご覧ください。
上の図を整理すると、、マクロ変数を定義する場所によって以下の動作をします。
マクロの外
・「グローバル」になる
マクロの中
・まず、同名のマクロ変数が既に定義されていないかチェックする。
・チェックする順は、「ローカル」→「グローバル」の順
・既に定義済の場合は、上書きする。
・「ローカル」にも「グローバル」にも定義済じゃない場合は、「ローカル」に新規作成。
では具体例でみていきましょう。
まず今回の解説で使うマクロ変数を予めリセット(削除)しときます。
%symdel MAC1 MAC2 MAC3 / nowarn;
|
① マクロ外で定義したマクロ変数が、「グローバル」になる例。
%let MAC1 = abcd;
%put _user_; ログ GLOBAL MAC1 abcd |
② マクロ内で定義したマクロ変数が、「ローカル」になる例。
%macro TEST( MAC2 );
%let MAC2 = 1234; %put _user_; %mend; %TEST( abcd ); TEST MAC2 1234 |
1つ補足ですが、マクロの引数として定義したマクロ変数は、必ず「ローカル」になります。
つまり、「%macro TEST( MAC2 )」でローカルマクロ変数「MAC2」を定義しています。
次に「%let MAC2 = 1234」で、上記で既に定義した同名のローカルマクロ変数を上書きしています。
③ マクロ内で定義したマクロ変数が「グローバル」になる例
%let MAC1 = abcd;
%macro TEST; %let MAC1 = 1234; %put _user_; %mend; %TEST; ログ GLOBAL MAC1 1234 |
同名のグローバルマクロ変数が既に定義済なので上書きします。
④ マクロ内で定義したマクロ変数が、「ローカル」になる例。
%macro TEST;
%let MAC3 = abcd; %put _user_; %mend; %TEST; TEST MAC3 abcd |
次回はCALL SYMPUTによるローカル・グローバルの判定方法を紹介します。
1. 基本概念
2. %LET編
3. CALL SYMPUT編
4. マクロ変数の展開
5. マクロ変数の作成場所を明示的に指定する
0 件のコメント:
コメントを投稿