2017-05-02 2 views
3

특정 매크로 변수가 없거나 존재하지 않는지 확인하는 간단한 매크로를 만들려고합니다. 일반적으로이 경우에는 %symexist이라는 두 개의 명령문이 필요하며 존재할 경우 null 값인지 여부를 감지하는 추가 논리가 필요합니다. 아래의 코드는이 모든 것을 하나로 결합한 것입니다.불일치 매크로 변수 데이터 형식

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

문제

반환 값은 항상 문자 것으로 보인다 때문에 내가하는 %if 성명에서 %isNull()을 사용할 수 없습니다. 이 동작은 열려있는 코드 또는 매크로 자체에있는 경우 다릅니다. 내가 매크로가 숫자 값으로 해결하지 좁혔습니다

을 시도했습니다 무엇

. 나는 동봉하는 것에서부터 %sysfunc(putn())%cmpres() to %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() 필요. 왜 Chang Chung의 정액 논문 인 Is This Macro Parameter Blank을 보시라. (아직 읽지 않았다면 더 좋은 정보가 필요하다.)

마지막으로 - 매크로 이름 바꾸기 및/또는 방향 반전을 제안 할 것입니다. %if %missm는 '이 매크로 변수가 누락 된 경우'라고 말하면서 반대입니다. 누락되어 있지 않으면 TRUE가 반환됩니다. %missm은 EQ [blank] 또는 NOT %symexist에 대해 true를 반환해야합니다. [정의되고 값을 포함]에 대해 false를 반환해야합니다.

+0

세미콜론이 다시 나타납니다. 우수 답변, 고마워요! –

+1

@StuSztukowski 명료하게하기 위해 이름을 바꾸는 경로를 따라 간다면'isMissing()'또는'is_missing'과 같은 이름을 사용하는 팬을 열렬히 생각하여'if' 문을 거의 읽을 때 일반 영어처럼. –

+1

제안 된 변경 사항을 작성하고 원래의 문제점을 편집했습니다. 감사! –