首先补充一点:
记得自己在看书的时候,好像是说%if %else 只能用在宏里面,但是昨天有人提醒现在的%if %else可以直接放在开放的代码里,也就是你没必要为了写%if %else 而写一个宏定义,比如下面这样:
%macro test;
%if %then %do;
%else %do;
%mend;
%test
上面这样是没必要的,你可以直接写%if %else,也就是两种方法都可以。这个注意一下就好了.
一:
不知道大家在开始学习宏的时候,发现在宏里面不能直接用in选项,你得写好几个or选项,比如在data步中我们可以直接写if a in (1:3) ,但是在宏里面你可能就得写上3个,if a=1 or a=2 or a=3;这要是有几十个选项,这不是要一大段or,显然不是很现实。在宏里面,其实也可以用in选项的。
直接用宏选项:
%macro inin;
%if aa in aa bb cc dd %then %do;
%put "this is a test";
%end;
%else %put "error,no in options";
%mend;
%inin
但是我们加上这个系统选项之后 minoperator:控制宏处理器是否识别和计算IN(#)逻辑运算符。
options minoperator;
%
macro inin;
%if aa in aa bb cc dd %then %do;
%put this is a test;
%end;
%else %put "error,no in options";
%mend;
%inin
需要注意列表需要以空格分隔,不能以逗号分隔,但是在DATA步中两种都可以。
但是我们自己可以指定分隔符,通过options mindelimiter=',';
指定分隔符后,如果你还是用空格的话,就会返回false,也就是跳到%else。
如果需要恢复空格,直接options mindelimiter='';就可以了。
同时在宏语言中#就代表in
%macro inin(var=,list=);
%if %upcase(&var) # %upcase(&list) %then %do;
%put &=var is in &list;
%end;
%else %put error,no in options;
%mend;
%inin(var=aa,list=aa bb cc dd);
二:
宏注释:
- %*; Macro comments 推荐
%*这是一句注释程序,放在宏里面安全;
- /* / style comments 推荐
/这也是一句注释语句,放在宏里面安全/
3) ; asterisk-style comments 不推荐
这种注释语句放在宏里面不安全,因为可能被识别成宏的一部分;这就让我想起了以前写的一篇文章,用这种注释方法,然后宏一直报错或者运行不出来。
SAS推荐用 //这种注释方法,这种注释会在任何其他类型的注释之前从代码中删除。
宏注释(%;)和星号风格的注释(* ;)是完整的语句,因此它们是标记化的。这意味着它们不能包含嵌入的分号或不匹配的引号。
需要注意的是,虽然上面这3种都是注释的方法,但是它们在log里面展示的方法却不一样。在宏定义里面,只有星号风格的注释(* ;)能显示在log(调用mprint的时候)
在开放式代码的时候,上面这3中注释方法都能显示在log里面。
下面把上面图片中的注释用Macro comments 和style comments 修改一下,这两种注释方法不会出现问题。
Macro comments:虽然在SASEG上看只有一段被注释了,但是程序能够正常运行的。
style comments:同时调用mprint;
加上星号注释,只有这种注释能显示在log里面
上面这些就是关于宏注释的一些知识点。