Echo SAS宏调用到SAS日志

时间:2015-08-26 16:02:57

标签: sas sas-macro

是否有系统选项或类似功能会自动将宏调用回显给SAS日志?在调试代码时,我想在日志中看到每个宏调用,包括传递的参数。

因此,如果我提交%Test(x = 1),日志将显示如下内容:

MACRO INVOKED: %TEST(x=1)

在开放代码中调用宏时,这不是问题,因为宏调用显示在通常的日志中。但是当外部宏调用内部宏时,默认情况下不会显示对%inner的实际调用。我尝试打开MLOGIC,MPRINT等,但找不到能给我看宏调用的东西。我想我想要的是一个MINVOCATION选项。

下面我通过将/ parmbuff添加到宏定义来伪造一个MINVOCATION选项,但希望有一种方法来查看宏调用而不会破坏宏定义。

%macro test(x=0,y=0,debug=0) /parmbuff ;
  %if &debug %then %put MINVOCATION: %nrstr(%%)&sysmacroname&syspbuff ;
  data _null_ ;
    x=&x ;
    y=&y ;
    put x= y= ;
  run ;
%mend test ;

%macro outer(debug=0) /parmbuff ;
  %if &debug %then %put MINVOCATION: %nrstr(%%)&sysmacroname&syspbuff ;
  %test(x=1,debug=&debug)
  %test(x=1,y=2,debug=&debug)
%mend outer ;

options mprint mprintnest ;
%outer(debug=1)

返回所需的:

908  options mprint mprintnest ;
909  %outer(debug=1)
MINVOCATION: %OUTER(debug=1)
MINVOCATION: %TEST(x=1,debug=1)
MPRINT(OUTER.TEST):   data _null_ ;
MPRINT(OUTER.TEST):   x=1 ;
MPRINT(OUTER.TEST):   y=0 ;
MPRINT(OUTER.TEST):   put x= y= ;
MPRINT(OUTER.TEST):   run ;

x=1 y=0

MINVOCATION: %TEST(x=1,y=2,debug=1)
MPRINT(OUTER.TEST):   data _null_ ;
MPRINT(OUTER.TEST):   x=1 ;
MPRINT(OUTER.TEST):   y=2 ;
MPRINT(OUTER.TEST):   put x= y= ;
MPRINT(OUTER.TEST):   run ;

x=1 y=2

2 个答案:

答案 0 :(得分:1)

我想你可能正在寻找option mlogic

示例代码:

option mprint mlogic ;

%macro y(blah);
  %put &blah;
%mend;

%macro x();
  %y(hello);
  %put x;
%mend;
%x;

给出:

MLOGIC(X):  Beginning execution.
MLOGIC(Y):  Beginning execution.
MLOGIC(Y):  Parameter BLAH has value hello
MLOGIC(Y):  %PUT &blah
hello
MLOGIC(Y):  Ending execution.
MPRINT(X):  ;
MLOGIC(X):  %PUT x
x
MLOGIC(X):  Ending execution.

你可以看到它告诉你宏开始执行,执行哪个宏,以及传入的任何参数的值。

更新

根据您的澄清,这是我能找到的最接近的。基本上你需要为'存储'宏设置一个libname。定义宏时,添加选项/ store source以告诉它将宏的源代码存储到存储的宏库中:

libname mac "e:\temp";
option mstored sasmstore=mac;

%macro blah(something=whatever) / store source;
  %put hi;
%mend;

您可以稍后使用%copy宏(SAS v9 +)检索源代码。此宏具有将源写入文件而不是日志的选项。然后,您可以读入文件并自行提取默认参数值。

%COPY blah / source;

给出:

%macro blah(something=whatever) / store source;
%put hi;
%mend;

This whitepaper会详细介绍。

这是我知道的很多额外步骤,但这似乎是一个非常不寻常的请求。

您可能最好重新考虑一下策略。例如,一个更简单的方法可能只是以这种方式定义默认值:

%macro hasDefaults(x=1,y=2);
  %local default_x default_y;
  %let default_x = 1;
  %let default_y = 2;
  %if &x ne &default_x %then %do;
    %put The default for x was changed from &default_x to &x.;
  %end;
%mend;

这远非理想,但你必须权衡能够更好地满足你需求的东西。

答案 1 :(得分:0)

如果您愿意更新所有宏,这听起来像是你必须要做的,那么添加如何:

%put _local_;

在每个顶部?在宏调用时,定义的唯一本地宏变量将是那些参数,对吧?

%macro mymacro(x=,y=,z=);
 %put _local_;
 proc print data=sashelp.class;
 run;
%mend mymacro;

%mymacro(x=1,y=2);

给出日志:

08  %mymacro(x=1,y=2);
MYMACRO X 1
MYMACRO Y 2
MYMACRO Z

NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: PROCEDURE PRINT used (Total process time):
      real time           0.05 seconds
      cpu time            0.03 seconds

您也可以随时将宏名称放在那里:

%macro mymacro(x=,y=,z=);
 %put MACRO INVOKED: &sysmacroname;
 %put Parameters:;
 %put _local_;
 proc print data=sashelp.class;
 run;
%mend mymacro;

%mymacro(x=1,y=2);

虽然它已作为%put _local_的一部分归还,但它可能无关紧要。