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 件のコメント:
コメントを投稿