我正在尝试创建一个非常简单的宏来确定是否提供了宏参数。但是,我收到错误消息“在表达式中找不到所需的运算符:%is_def(& param1)”。这段代码有什么问题?
%macro is_def(var);
(%length(&var) > 0);
%mend;
%macro do_something(param1);
%if %is_def(¶m1) %then %do;
%put parameter was provided;
%end;
%else %do;
%put parameter was NOT supplied;
%end;
%mend;
%do_something(5);
答案 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。