2017-05-02 12 views
3

特定のマクロ変数が存在しないか存在しないかをチェックする単純なマクロを作成しようとしています。通常、これには2つのステートメント(%symexist)が必要です。存在する場合は、それがヌル値であるかどうかを検出する追加のロジックです。以下のコードは、そのすべてを1つにまとめたものです。一貫性のないマクロ変数データ型

%macro isnull(macvar); 
    %sysevalf(%superq(%superq(macvar)) NE %str(), boolean); 
%mend isnull; 

問題

戻り値は常に文字のようですので、私は、%if文で%isNull()を使用することはできません。この動作は、オープンコード内またはマクロ内にある場合には異なります。私は

を試してみた何

私は数値として解決していないマクロにそれを絞り込むました。私は%sysfunc(putn())%cmpres()%sysfunc(compress())でそれを囲むことからすべてを試しました。オープンコードの場合は数値です。それが別のマクロにある場合、それは文字です。あなたは、このコードでそれを見ることができます:

/* Miss2 resolves incorrectly as character */ 
%macro check; 
    %let miss1=%sysevalf(%superq(asdf) =, boolean); 
    %let miss2=%isNull(asdf); 

    %put Miss1: %datatyp(&miss1); 
    %put Miss2: %datatyp(&miss2); 
%mend; 
%check; 

/* Miss2 resolves correctly as numeric */ 
%let miss1=%sysevalf(%superq(asdf) =, boolean); 
%let miss2=%isNull(asdf); 

%put Miss1: %datatyp(&miss1); 
%put Miss2: %datatyp(&miss2); 

私はマクロが存在し、同時にブランクではないの両方かどうかを確認するために%if文でこれを使用することができるようにしたい

をしたいです。

%macro foo; 
    %if(%isNull(sysuserid) = 1) %then %put sysuserid exists; 
    %if(%isNull(asdffdsa) = 0) %then %put asdffdsa does not exist; 

    %if(%isNull(sysuserid) > 0) %then %put this should resolve; 
    %if(%isNull(asdffdsa) > 0) %then %put this should not resolve; 
%mend; 
%foo; 
+0

これを見ても間違いから始めると、マクロ変数には 'タイプ'がありません。それらは_all_テキストです。 – Joe

+0

%MISSM()を関数であるかのように扱いたい場合は、セミコロンを生成できません!! – Tom

答えて

2

ここで問題になっているのは、マクロにセミコロンが含まれていることです。これを参照してください:

174 %macro check; 
175  %let miss1=%sysevalf(%superq(asdf) NE %str(), boolean); 
176  %let miss2=%missm(asdf); 
177 
178  %put &miss1. Miss1: %datatyp(&miss1); 
179  %put &miss2. Miss2: %datatyp(%unquote(&miss2)); 
180 %mend; 
181 %check; 
WARNING: Apparent symbolic reference ASDF not resolved. 
WARNING: Apparent symbolic reference ASDF not resolved. 
0 Miss1: NUMERIC 
0; Miss2: CHAR 

;に注意してください。代わりにこれをコンパイルします。

%macro missm(macvar); 
    %sysevalf(%superq(%superq(macvar)) NE %str(), boolean) 
%mend missm; 

とあなたが得る:

185 %macro check; 
186  %let miss1=%sysevalf(%superq(asdf) NE %str(), boolean); 
187  %let miss2=%missm(asdf); 
188 
189  %put &miss1. Miss1: %datatyp(&miss1); 
190  %put &miss2. Miss2: %datatyp(%unquote(&miss2)); 
191 %mend; 
192 %check; 
WARNING: Apparent symbolic reference ASDF not resolved. 
WARNING: Apparent symbolic reference ASDF not resolved. 
0 Miss1: NUMERIC 
0 Miss2: NUMERIC 

私は私はあなたが%symexistをスキップしてはならないと思うことも追加します。ここでやっているようにログに警告が表示されますが、これは簡単に回避できます。

%macro missm(macvar); 
    %if %symexist(&macvar.) %then 
    %sysevalf(%superq(%superq(macvar)) NE , boolean) 
    %else 
    0 
%mend missm; 

また、私は本当に何もしない%str()あなたの不要なを削除注意しましょう。なぜ、それとも何かより優れた情報があれば、それをまだ読んでいないのであれば、チャンチュンの精書「Is This Macro Parameter Blank」を参照してください。

最後に、マクロの名前を変更したり、方向を逆にすることをお勧めします。 %if %missmは私にこのマクロ変数が見つからないと答えています。これはあなたが言っていることの反対です。欠けていなければTRUEを返します。 %missmは、EQ [空白]の場合はtrueを返し、そうでない場合は%symexistを返します。 [定義されていて値を含んでいます]に対してはfalseを返さなければなりません。

+0

セミコロンが再び襲います。優れた答えは、ありがとう! –

+1

@StuSztukowskiもしあなたがそれを明確にするために名前を変更する道筋をたどっているなら、 'isMissing()'や 'is_missing'のような名前を使うのは大好きです。普通の英語のように。 –

+1

私は提案された変更を行い、元の問題を編集しました。ありがとう! –

関連する問題