3

有没有一种捷径可以让在宏范围内创建的所有宏变量都在全局范围内?

IE:

%macro x;  
 %global _all_;  * ??? ;  
 %let x=1;  
 %let y=1;  
 %let z=1;  
%mend;
4

3 回答 3

5

我能想到的唯一方法是使用宏代替%let 语句,而不必提前将每个宏声明为全局宏然后执行%let 语句。

在下面的代码中,我创建了一个名为%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;
于 2009-03-06T00:34:56.410 回答
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;
于 2009-03-05T15:34:59.890 回答
3

如果您在数据步骤中创建宏变量,并且该数据步骤在宏内部,则默认情况下,创建的宏变量将是该宏范围内的本地变量。

采用

call symputx('macvar',macval,'g'); 

创建全局宏变量。

于 2009-03-24T11:17:01.127 回答