マクロ変数には、以下2種類あるのをご存知でしょうか?
ローカルマクロ変数 |
定義したマクロ内でしか参照できないマクロ変数 (そのマクロが実行終了すると消去される)
|
グローバルマクロ変数 |
どの場所からでも参照できるマクロ変数 (ただし、CARDS, DATALINESステートメント内では参照不可) |
では具体例を見ていきます。
(ただし、どうしてこれがローカルになるの?グローバルになるの?っていうのは別記事で紹介予定なので、今は気にしないでください。)
ローカルマクロ変数の例
以下マクロ「TEST」の中で、ローカルマクロ変数「X」を定義しています。
(ただし、どうしてこれがローカルになるの?グローバルになるの?っていうのは別記事で紹介予定なので、今は気にしないでください。)
以下マクロ「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のシンボリック参照を解決できません。 |
マクロ内で定義したローカルマクロ変数は、マクロの実行中にしか存在しないので、マクロ外からの展開は出来ません。
以下では、グローバルマクロ変数「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_ … 自動マクロ変数を表示
_LOCAL_ ... ローカルマクロ変数を表示(自動マクロ変数は含まず)
_ALL_ … 全てのマクロ変数を表示(自動マクロ変数を含む)
_USER_ … 全てのマクロ変数を表示(自動マクロ変数は含まず)
0 件のコメント:
コメントを投稿