2017年8月17日木曜日

そのマクロ変数、ローカル?グローバル?④マクロ変数の展開



「ローカル」 と 「グローバル」 に同名のマクロ変数が存在する場合、どちらを優先して展開するのか? という問題です。




フロー図


マクロ変数の展開を「マクロ内」で行っているのか、「マクロの外」で行っているのかによって、以下のとおり展開結果が変わります。





文章でまとめると、
・「マクロ外」では「グローバルマクロ変数」 が展開される。
・「マクロ内」では「ローカルマクロ変数」→「グローバルマクロ変数」 の優先順位で展開される。




具体例


たとえば以下では、同じ名前のローカル・グローバルマクロ変数を定義しています。

%macro TEST;

    data _null_;
          call symputx( "MAC1", "1234", "L" );
          call symputx( "MAC1", "abcd", "G" );
    run;

    %put _user_;

%mend;
%TEST;

ログ
TEST MAC1 1234
GLOBAL MAC1 abcd

(※ CALL SYMPUTXでローカル・グローバルマクロ変数を分けて作る方法は以下で紹介済み。また次回記事でも紹介予定。)





では以下のように、%PUTを使って、マクロ内とマクロ外でマクロ変数を展開してログに出力してみます。

%macro TEST;

    data _null_;
          call symputx("MAC1","1234","L");
          call symputx("MAC1","abcd","G");
    run;

    %put マクロ内 ---> &MAC1;

%mend;
%TEST;

%put マクロ外 ---> &MAC1;


ログ
マクロ内 ---> 1234
マクロ外 ---> abcd

ログを見て頂くと分かる通り、結果はフロー図で示した通りですね。


0 件のコメント:

コメントを投稿