2017-06-22 103 views
1

有没有办法将宏作为参数传递给宏?SAS - 将宏传递给宏

%macro outer_macro(macro); 
    %do i=1 %to 5; 
    &macro 
    %end; 
%mend outer_macro; 

%macro inner_macro; 
    /* do something usefull */ 
%mend inner_macro; 

%outer_macro(%inner_macro) 

这个例子不工作,当然。

回答

5

您将使用宏引用来完成此操作。

一个简单版本的例子:

%macro outer_macro(macro); 
    %put Starting outer macro; 
    %unquote(&macro) /* %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(&macro)(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)) 
2

为什么不按名称传递宏?

%macro outer_macro(macro); 
    %put Starting &sysmacroname - MACRO=%superq(macro); 
    %&macro 
    %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的结果LOG。

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