SAS-将宏传递给宏
有没有办法将宏作为参数传递给宏 差不多SAS-将宏传递给宏,sas,sas-macro,Sas,Sas Macro,有没有办法将宏作为参数传递给宏 差不多 %macro outer_macro(macro); %do i=1 %to 5; ¯o %end; %mend outer_macro; %macro inner_macro; /* do something usefull */ %mend inner_macro; %outer_macro(%inner_macro) 当然,此示例不起作用。您可以使用宏引用来完成此操作 您的示例的简单版本: %macro o
%macro outer_macro(macro);
%do i=1 %to 5;
¯o
%end;
%mend outer_macro;
%macro inner_macro;
/* do something usefull */
%mend inner_macro;
%outer_macro(%inner_macro)
当然,此示例不起作用。您可以使用宏引用来完成此操作 您的示例的简单版本:
%macro outer_macro(macro);
%put Starting outer macro;
%unquote(¯o) /* %unquote removes the NRSTR escape characters */
%put Ending outer macro;
%mend outer_macro;
%macro inner_macro;
%put Starting inner macro;
proc print data=sashelp.class;
run;
%put Ending inner macro;
%mend inner_macro;
%outer_macro(%nrstr(%inner_macro)) /* %nrstr is execution-time quoting, so %inner_macro is passed and not treated as a macro until %unquote removes the quoting */
要涉及循环之类的内容,只需确保所有内容都设置为使用循环迭代器—一种方法是简单地在循环中附加()
%macro outer_macro(macro);
%put Starting outer macro;
%do i = 1 %to 19;
%unquote(¯o)(n=&i.) /* resolves to %inner_macro(n=&i.) */
%end;
%put Ending outer macro;
%mend outer_macro;
%macro inner_macro(n=);
%put Starting inner macro;
proc print data=sashelp.class(obs=&n. firstobs=&n.);
run;
%put Ending inner macro;
%mend inner_macro;
%outer_macro(%nrstr(%inner_macro))
您可以使用宏引用来实现这一点 您的示例的简单版本:
%macro outer_macro(macro);
%put Starting outer macro;
%unquote(¯o) /* %unquote removes the NRSTR escape characters */
%put Ending outer macro;
%mend outer_macro;
%macro inner_macro;
%put Starting inner macro;
proc print data=sashelp.class;
run;
%put Ending inner macro;
%mend inner_macro;
%outer_macro(%nrstr(%inner_macro)) /* %nrstr is execution-time quoting, so %inner_macro is passed and not treated as a macro until %unquote removes the quoting */
要涉及循环之类的内容,只需确保所有内容都设置为使用循环迭代器—一种方法是简单地在循环中附加()
%macro outer_macro(macro);
%put Starting outer macro;
%do i = 1 %to 19;
%unquote(¯o)(n=&i.) /* resolves to %inner_macro(n=&i.) */
%end;
%put Ending outer macro;
%mend outer_macro;
%macro inner_macro(n=);
%put Starting inner macro;
proc print data=sashelp.class(obs=&n. firstobs=&n.);
run;
%put Ending inner macro;
%mend inner_macro;
%outer_macro(%nrstr(%inner_macro))
为什么不直接按名称传递宏
%macro outer_macro(macro);
%put Starting &sysmacroname - MACRO=%superq(macro);
%¯o
%put Ending &sysmacroname;
%mend outer_macro;
%macro inner_macro(dsn);
%put Starting &sysmacroname - &=dsn;
proc print data=&dsn;
run;
%put Ending &sysmacroname;
%mend inner_macro;
%outer_macro(inner_macro(sashelp.class)) ;
打开MPRINT时生成的日志
Starting OUTER_MACRO - MACRO=inner_macro(sashelp.class)
Starting INNER_MACRO - DSN=sashelp.class
MPRINT(INNER_MACRO): proc print data=sashelp.class;
MPRINT(INNER_MACRO): run;
NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: PROCEDURE PRINT used (Total process time):
real time 0.04 seconds
cpu time 0.00 seconds
Ending INNER_MACRO
Ending OUTER_MACRO
为什么不直接按名称传递宏
%macro outer_macro(macro);
%put Starting &sysmacroname - MACRO=%superq(macro);
%¯o
%put Ending &sysmacroname;
%mend outer_macro;
%macro inner_macro(dsn);
%put Starting &sysmacroname - &=dsn;
proc print data=&dsn;
run;
%put Ending &sysmacroname;
%mend inner_macro;
%outer_macro(inner_macro(sashelp.class)) ;
打开MPRINT时生成的日志
Starting OUTER_MACRO - MACRO=inner_macro(sashelp.class)
Starting INNER_MACRO - DSN=sashelp.class
MPRINT(INNER_MACRO): proc print data=sashelp.class;
MPRINT(INNER_MACRO): run;
NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: PROCEDURE PRINT used (Total process time):
real time 0.04 seconds
cpu time 0.00 seconds
Ending INNER_MACRO
Ending OUTER_MACRO