我们可以调用由其创建的GLOBAL MACRO变量 %let, %do, callsymput, sql into子句,
宏参数,
请告诉我。答案 0 :(得分:1)
为了便于讨论,最高范围是全球范围
在&符号或superq分辨率时使用的宏变量是当前或最接近的更高范围。如果您需要来自高于默认值的作用域的相同命名宏变量值,则必须从字典表中查询它(SASHELP.VMACRO)
当您计划从宏调用中执行的代码填充全局宏变量时,使用%GLOBAL语句声明宏变量;
使用宏函数%SYSMEXECDEPTH可以知道宏的执行深度。宏系统的“反射”有许多其他宏函数,主要是SAS documentation中的SYS *和SYM *函数。
一个例子。即使在宏执行深度中调用了zoot,zoot宏也会填充全局宏变量age。
options nocenter;
%let MY_MACRO_VAR = global;
%macro foo;
%local MY_MACRO_VAR;
%let MY_MACRO_VAR = local_1;
%put &=MY_MACRO_VAR;
options nolabel;
title "&SYSMACRONAME %nrstr(%SYSMEXECDEPTH=)%SYSMEXECDEPTH";
proc sql;
select * from dictionary.macros
where name = 'MY_MACRO_VAR';
quit;
options label;
%bar;
%mend;
%macro bar;
%local MY_MACRO_VAR;
%let MY_MACRO_VAR = local_%SYSMEXECDEPTH;
%put &=MY_MACRO_VAR;
options nolabel;
title "&SYSMACRONAME %nrstr(%SYSMEXECDEPTH=)%SYSMEXECDEPTH";
proc sql;
select * from dictionary.macros
where name = 'MY_MACRO_VAR';
quit;
options label;
%put &SYSMACRONAME %nrstr(%SYSMEXECDEPTH=)%SYSMEXECDEPTH;
%put _user_;
%if %SYSMEXECDEPTH=2 %then %bar;
%zoot
%mend;
%macro zoot;
%global my_global;
proc sql noprint;
select age into :my_global from sashelp.class where name = 'Jane';
quit;
%mend;
%foo;
%put _user_;
与宏系统的其他交互范围,例如EXECUTE,SYMGET或RESOLVE,可能会变得相当微妙。