2017年8月15日火曜日

SASのブラックホール問題




SASはたまにブラックホールを生み出します。
やばいです、SASコードを全部吸い込んじゃいます。



、、何を言っているかというと、ほとんどのSASプログラマーが経験する問題のことです。
以下をご覧ください。

%macro TEST;
   data DT1;
      set SASHELP.CLASS;
   run;
%mend;
%TEST;

proc print data=DT1;
run;

proc means data=DT1;
run;


上のプログラムでもし「%mend;」を書き忘れた場合、どうなるでしょう?
まだマクロの定義が終わっていないとみなされて、その後に続く proc print や proc means もマクロに吸い込まれていってしまいます。

この現象のことを 「ブラックホール問題」 とか 「”ブラックホール”マクロ問題」 と呼びます。



よくマクロの中にマクロを書いてると、一方のマクロを「%mend;」で閉め忘れてしまってブラックホール作っちゃう事があるんですよね。

そうならないために以下のように「%mend TEST;」って感じで、マクロ名も書くとマクロの開始と終了が分かり易くなります。

%macro TEST;
   data DT1;
      set SASHELP.CLASS;
   run;
%mend TEST;


ほかにも文字列をクォーテーションで囲むときに閉め忘れてブラックホール状態になることありますね。



ブラックホールが出来てしまったら、色々対処法ありますが、SASコードを吸い込んで肥大化したブラックホールマクロは何しでかすか分からないので、SASを再起動しちゃった方が確実です。


もしこの問題に直面してる人を見かけたら「あ、それはいわゆるブラックホール問題ってやつですね」っていって、この呼び方を流行らせましょう。


0 件のコメント:

コメントを投稿