从另一个宏的if条件调用宏

时间:2016-03-17 16:46:54

标签: sas

我正在尝试创建一个非常简单的宏来确定是否提供了宏参数。但是,我收到错误消息“在表达式中找不到所需的运算符:%is_def(& param1)”。这段代码有什么问题?

%macro is_def(var);
    (%length(&var) > 0);
%mend;

%macro do_something(param1);

    %if %is_def(&param1) %then %do;
        %put parameter was provided;
    %end;
    %else %do;
        %put parameter was NOT supplied;
    %end;

%mend;

%do_something(5);

1 个答案:

答案 0 :(得分:3)

你的宏%is_def是一个函数式宏。你有一个额外的分号,导致错误。

如上所述,您调用%is_def(hello)宏将返回此代码:

(5 > 0);

5是因为你好5个字符长。注意最后的分号,你不需要分号。

如上所述,%Do_Something中的%IF语句最终会像:

%if (5 > 0); %then %do;

看着那个,你就会明白分号导致问题的原因。

要修复,您应该删除分号,即更改为:

%macro is_def(var);
    (%length(&var) > 0)
%mend;

另一种可能的增强方法是让is_def宏只返回1或0表示true或false,而不是返回(5 > 0)。为此,您可以这样做:

%macro is_def(var);
    %eval(%length(&var) > 0)
%mend;

关于此主题(测试空白参数)有一篇优秀的论文,它考虑了这种方法以及其他几种方法,并以实用程序宏%IsBlank结束。建议你查看一下:http://changchung.com/download/022-2009.pdf