为什么不让%创建一个本地宏变量?

Ale*_*lex 6 sas

我一直认为如果在里面使用它%let会创建一个local变量%macro . . . %mend

但是当我运行此代码时,SAS日志显示 GLOBAL TESTVAR value1

%let testVar = value2; 
%macro test; 
%let testVar = value1; 
%mend;   

%test 

%put _all_;
Run Code Online (Sandbox Code Playgroud)

所以,我无法理解为什么全局变量的值testVar改变为value1.我原以为它没有改变value2.在%let里面的语句%macro应该影响只在本地符号表.

SAS文档说:

当宏处理器执行可以创建宏变量的宏程序语句时,如果没有可用的具有相同名称的宏变量,宏处理器将在本地符号表中创建该变量

MDe*_*MDe 7

关键是"如果没有可用的同名宏变量" - 在这种情况下,可以使用具有相同名称的宏变量,因为您已经将testVar定义为全局变量.

您可以为其指定一个不与全局共享的名称,也可以将其明确声明为local:

%let testVar = value2; 
%macro test; 
    %local testVar;
    %let testVar = value1; 
%mend;   

%test 
Run Code Online (Sandbox Code Playgroud)

  • @Alex你应该总是将宏中的变量显式声明为local(如果你希望它们是本地的).如果您的宏恰好调用其他宏(或被另一个宏调用),则不这样做可能会导致一些难以调试的代码. (2认同)