2017年7月18日火曜日

そのマクロ変数、ローカル?グローバル?①基本概念




マクロ変数には、以下2種類あるのをご存知でしょうか?

 ローカルマクロ変数


 定義したマクロ内でしか参照できないマクロ変数
 (そのマクロが実行終了すると消去される)

 グローバルマクロ変数 
 
 
 どの場所からでも参照できるマクロ変数
 (ただし、CARDS, DATALINESステートメント内では参照不可




では具体例を見ていきます。
(ただし、どうしてこれがローカルになるの?グローバルになるの?っていうのは別記事で紹介予定なので、今は気にしないでください。)




ローカルマクロ変数の例


以下マクロ「TEST」の中で、ローカルマクロ変数「X」を定義しています。

%macro  TEST;
     %let  X = abcd;
%mend;

%TEST;


ここで以下赤字の%putステートメントを用いて、
マクロ「TEST」の中で、マクロ変数 X の値を展開してみます。

%macro  TEST;
     %let  X = abcd;
     %put  &X;
%mend;

%TEST;

ログ
abcd


問題なくマクロ変数 X の値が展開できている事が分かります。
では次に、マクロの外で展開しようとすると、、

%macro  TEST;
     %let  X = abcd;
%mend;

%TEST;
%put  &X;

ログ
WARNING: Xのシンボリック参照を解決できません。

怒りのWARNINGが出てしまいます。
マクロ内で定義したローカルマクロ変数は、マクロの実行中にしか存在しないので、マクロ外からの展開は出来ません。




グローバルマクロ変数の例


以下では、グローバルマクロ変数「Y」を定義しています。
どこからでも展開することができます。

%let  Y = xyz;
%put  &Y;

%macro  TEST;
     %put  &Y;
%mend;
%TEST;

ログ
xyz
xyz




マクロ変数の表示。


マクロ変数がローカルとグローバルどちらで格納されているのか判断がつかない場合の対処法。

以下 「%put _user_;」で調べる事が出来ます。

%let  Y = xyz;

%macro  TEST;
     %let  X = abcd;
     %put  _user_;
%mend;
%TEST;

ログ
 TEST X abcd
 GLOBAL Y xyz

実際のログには余計なマクロ変数の値が出ますが、上の例ではそれらを除いて分かり易くしてます。
ログの結果から以下が分かります。

・マクロ「TEST」のローカルマクロ変数「X」 には "abcd" という値が格納されている
・グローバルマクロ変数「Y」には "xyz" という値が格納されている


_USER_ 以外にも以下の指定が可能です。

_AUTOMATIC_ … 自動マクロ変数を表示
_GLOBAL_       … グローバルマクロ変数を表示(自動マクロ変数は含まず)
_LOCAL_          ... ローカルマクロ変数を表示(自動マクロ変数は含まず)
_ALL_               … 全てのマクロ変数を表示(自動マクロ変数を含む)
_USER_            … 全てのマクロ変数を表示(自動マクロ変数は含まず)

0 件のコメント:

コメントを投稿