2017年7月25日火曜日

そのマクロ変数、ローカル?グローバル?②%LET編




%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 件のコメント:

コメントを投稿