一、先从最宏观的角度来了解宏,这里的宏观角度是指程序的运行流程:
1,提交代码后,SAS先把代码读取储存到堆栈中;
2,用文本扫描插件来扫描堆栈中的代码,从上到下,从左到右;
3,扫描到一个分号,则编译之前的代码,(有错则警告报错或者停止扫描)
4,读到%,&的宏则马上调用宏编译器对宏进行替换,直到替换完为止;
5,扫描到代码边沿(RUN,DATA,PROC )则暂停扫描,执行以上代码;
6,然后接着扫描下一步,重复2-5步骤。
可以理解成一小段代码给你,先把宏给替换完再执行别的。
二、储存宏变量
%LET在宏的外面,则直接检查为全局宏变量表,若存在则替换刷新该宏值,
若在宏函数里面,则:
1,检查局部宏变量表,若存在则更新,
2,不存在则检查全局宏变量表,存在则更新,
3,不存在则在局部宏变量表创建一个该宏变量。
三、类似的工作久了,可以将一些常用的宏写在一个固定的逻辑库中,以后可以随时调用,以提高工作效率。
如:
LIBNAME ZLJ_MACRO "H:\ZLJ_MACRO"; OPTIONS MSTORED SASMSTORE=ZLJ_MACRO; %MACRO A/STORE SOURCE; PROC FREQ; TABLES X/MISSING; RUN; %MEND;
第二句是为了指明存放宏 的逻辑库,如要将一个宏储存起来,则只需想第三行一样写“STORE SOURCE”就可以永久保存,调用可普通临时宏调用方法一样。