Я пытаюсь сделать простой макрос, который проверяет, отсутствует ли конкретная переменная макроса или не существует. Обычно для этого требуются два оператора: %symexist
и, если он существует, дополнительная логика для определения, является ли это нулевым значением. Приведенный ниже код объединяет все это в одно целое.
%macro isnull(macvar);
%sysevalf(%superq(%superq(macvar)) NE %str(), boolean);
%mend isnull;
Проблема
Я не могу использовать %isNull()
в операторе %if
, потому что возвращаемое значение всегда кажется символом. Это поведение различается в открытом коде или в самом макросе.
Что я пробовал
Я сузил его до макроса, который не разрешается как числовое значение. Я перепробовал все, от заключения с %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;