是否有系统选项或类似功能会自动将宏调用回显给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
答案 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_
的一部分归还,但它可能无关紧要。