ラベル ステートメント: %LOCAL の投稿を表示しています。 すべての投稿を表示
ラベル ステートメント: %LOCAL の投稿を表示しています。 すべての投稿を表示

2017年8月28日月曜日

そのマクロ変数、ローカル?グローバル?⑤マクロ変数の作成場所を明示的に指定する




マクロ変数を作成する場所(ローカル or グローバル)を明示的に指定することが出来ます。




「%LOCAL」と「%GLOBAL」を使う


・「%LOCALステートメント」で「ローカルマクロ変数」を作成できます。
・「%GLOBALステートメント」で「グローバルマクロ変数」を作成できます。


構文

  %LOCAL    マクロ変数1  マクロ変数2 ・・・;
  %GLOBAL  マクロ変数1  マクロ変数2 ・・・;




使用例の前にまずは、今回つかうマクロ変数をリセット(削除)しときます。
%symdel  MAC1 MAC2 MAC3 MAC4 MAC5  /  nowarn;



%macro TEST;

    %local    MAC1  MAC2 ;
    %global  MAC3 ;

    %put _user_;

%mend;
%TEST;

ログ
TEST MAC1
TEST MAC2
GLOBAL MAC3





「CALL SYMPUTX」を使う


CALL SYMPUTXの第3引数で、ローカル・グローバルどちらに作成するか指定できます。


構文

  CALL SYMPUTX( "マクロ変数名", "格納する値" , "G") ;
  CALL SYMPUTX( "マクロ変数名", "格納する値" , "L") ;


"G": グローバルマクロ変数にする
"L": ローカルマクロ変数にする(マクロ外で実行するとグローバルマクロ変数になる)


%macro TEST;

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

    %put _user_;

%mend;
%TEST;

ログ
TEST MAC4 abcd
GLOBAL MAC5 1234


ローカルマクロ変数はマクロ終了とともに消えるので、無駄なマクロ変数が残りません。
なのでローカルマクロ変数を明示的に定義する方が内部的にはキレイなプログラムといえると思います。



記事一覧

1. 基本概念
2. %LET編
3. CALL SYMPUT編
4. マクロ変数の展開
5. マクロ変数の作成場所を明示的に指定する

2014年7月19日土曜日

値をマクロ変数に格納する「CALL SYMPUTX」その2




前回の続きです。ちょっとした落とし穴を紹介。


まず以下の例を見てみましょう。

* マクロ変数を削除 ;
%symdel X  / nowarn;

* call symputxでマクロ変数を作りログに出力 ;
%macro TEST;
     data _null_;
         call symputx("X", "abcd");
     run;
%mend;
%TEST;

%put "&X";

ログ
"abcd"



ログを見てみると、問題なくマクロ変数を参照できてますね。
では次のプログラムはどうでしょうか?

* マクロ変数を削除 ;
%symdel X2 X3 / nowarn;

* call symputxでマクロ変数を作りログに出力 ;
%macro TEST2;
     %let X2=1;
     data _null_;
         call symputx("X3", "abcd");
     run;
%mend;
%TEST2;

%put "&X3";

ログ
WARNING: 記号参照X3を展開していません。


WARNINGが出て参照できませんでした。
最初のマクロとの違いと言えば「%let X2=1;」が追加されたくらいですが、実はこれが影響してます。


超ざっくり説明すると、「%let X2=1;」はマクロTEST2の中で定義してるマクロ変数で、いわゆるローカルマクロ変数(以下参照)です。

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

  グローバルマクロ変数:
   どの場所からでも参照できるマクロ変数


マクロの中でひとつでもローカルマクロ変数があると、同マクロ内に書かれたCALL SYMPUTXの結果もローカルマクロ変数となります。(グローバルマクロ変数になる場合もある。詳細はこちらを参照)





もしグローバルマクロ変数に変えたい場合、はじめに「%GLOBAL マクロ変数名;」を追記すればOK。
逆にローカルマクロ変数にしたい場合は、%LOCALステートメントを追記します。

またSYMPUTにはなくSYMPUTXのみの機能として以下のように書けちゃいます。

  call symputx("X3", "abcd" , "G") ;

  "G" …  グローバルマクロ変数にする。
  "L"  …  ローカルマクロ変数にする(マクロ外で実行するとグローバルマクロ変数になる)


この点もCALL SYMPUTXを使うメリットだと思います。