SAS - 将宏传递给宏

arj*_*arj 1 sas sas-macro

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

就像是

%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)
Run Code Online (Sandbox Code Playgroud)

当然,这个例子不起作用.

Joe*_*Joe 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 */
Run Code Online (Sandbox Code Playgroud)

要涉及类似循环的东西,你只需要确保所有东西都设置为采用循环迭代器 - 一种方法就是简单地用循环追加().

%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))
Run Code Online (Sandbox Code Playgroud)