我有一些遗留SAS代码,用于在数据步骤中定义宏。这是如何运作的?是否为DATA步骤的每次迭代编译宏?
data test;
set temp;
%macro cal_sum(iput);
%let a=&input.;
%mend;
REPORTING_DATE = &PROCDATE.;
call execute('%cal_sum(testval)');
run;
答案 0 :(得分:1)
没有。在这种情况下,宏在数据步骤执行之前被编译。对于数据步骤的每次迭代,只有三种方法可以运行/编译宏:
dosubl()
run_macro
来电中fcmp
call execute
- 但请注意,任何生成的SAS代码都会在数据步骤之后执行。它的工作方式是:
data test; set temp;
被发送到堆栈,准备在下一步边界执行
%macro cal_sum(iput);%mend;
宏(未执行)
REPORTING_DATE = &PROCDATE.;run;
被发送到堆栈并执行(因为run;
语句是一个步骤边界)
答案 1 :(得分:1)
宏代码(在本例中为宏定义)在SAS执行程序编译和运行数据步骤之前完全解析。
所以不,不会为DATA步骤的每次迭代编译宏。
另外,正如您所知,每次迭代都不会调用在数据步骤内编码的宏调用,但是,无论宏调用发出的源代码是什么。