nomreplaceオプションでマクロの上書きをブロックする方法

以下の2つのコードを実行します

%macro mm;
%put AAAA ;
%mend mm;

%macro mm;
%put BBBB ;
%mend mm;

そして


%mm

とマクロを実行したとき、ログにでるのはAAAA BBBBどっちでしょうか?
はい、BBBBです。そりゃそうですね。
%macroステートメントで、既にマクロカタログに存在している(コンパイル済)マクロ名を指定した場合
マクロの内容は上書きされます。

さて、それはいいんですが、そのことで怖い思いをした経験はあるでしょうか?
要するに、うっかり別の処理を同じマクロ名で書いてしまって上書きしてしまい、実行時に
意図していない処理が行われたという感じの体験です。
僕はあります。

基本、自分で書いた1つのプログラム内であれば、よほど疲れてない限り、同じマクロ名使っちゃうことは
少ないと思います。

ただ、例えば%include等を使えば、他のプログラムのマクロを実行できるわけですが
大規模な仕事になってくると、それが結構な量になりがちです。

しかも他人の書いたプログラムと共有する場合、なにか管理する術を考えないと、高確率で
バッティングします。

データを読み込むマクロに名前をつけろと言われたら
%makedataとか%datainとか%dataimpとか、似たりよったりな命名になりがちです。

また、1人でやっててもロジカルチェックとかで各チェックをマクロにしてる場合とか、途中の仕様変更で
チェック番号の全振り直しとかふざけてたことが起きたりして、やっちゃたりします。


さて、そういった時、実行したコードでマクロ名がバッティングして上書きが起きていないかを
確かめるにはどうすればいいでしょう。

options nomreplace;

としてから、実行してみましょう。


%macro mm;
%put AAAA ;
%mend mm;

とすると
ERROR: マクロ MM はコンパイルされません。 NOMREPLACE
       オプションが設定されています。
       ソースコードは、 %MEND
       ステートメントが検出されるまで取り除かれます。

とエラーがでてきます。

これがでるということはその時点で、指定したマクロ名は既にコンパイル済の状態ということです。
おしまい。

ちなみに

options mreplace;

で元の状態に戻ります。

0 件のコメント:

コメントを投稿