是否有一种简短的方法可以在范围内的宏全局内创建所有宏变量?
即:
%macro x;
%global _all_; * ??? ;
%let x=1;
%let y=1;
%let z=1;
%mend;
答案 0 :(得分:5)
我可以想到这样做的唯一方法,而不必提前将每个宏声明为全局,然后执行%let语句就是使用宏 代替 < / strong>%let statement。
在下面的代码中,我创建了一个名为%mylet 的宏,其唯一目的是创建一个全局变量,其名称和值作为参数传递。然后我使用这个宏代替%let,我想要定义全局变量。
例如。
%global myvar;
%let myvar=2;
会变成......
%mylet(myvar,2);
/* Define a macro to declare variables as global */
%macro mylet(var,value);
%global &var;
%let &var.= &value ;
%mend;
/* Test macro */
%macro test;
%mylet(myvar,2);
%mylet(myvar2,12);
%mylet(myvar3,'string');
/* see that they are global inside the macro */
title "Macro scope inside test macro";
proc sql;
select *
from dictionary.macros
where name in('MYVAR','MYVAR2','MYVAR3');
quit;
%mend;
%test;
/* Check to see if they are still global outside the macro */
title "Macro scope outside test macro";
proc sql;
select *
from dictionary.macros
where name in('MYVAR','MYVAR2','MYVAR3');
quit;
答案 1 :(得分:4)
如果在开放代码中创建宏变量,宏变量将自动添加到全局宏符号表中:
%let x=1;
%let y=1;
%let z=1;
在创建较大的宏之前 :
另一种方法是使用数据步骤创建变量:%macro x;
<code here>
%mend x;
data _null_;
set LIB.DSET;
x = 1;
call symput('x',x);
run;
答案 2 :(得分:3)
如果在数据步骤中创建宏变量,并且该数据步骤在宏内,则默认情况下,创建的宏变量将在该宏的范围内本地化。
使用
call symputx('macvar',macval,'g');
创建全局宏变量。