经过一番纠结,貌似自己纠结出来了。。。
首先说明下%let的赋值过程
以:%let a = b; 为例
先在local variable table查找宏变量a是否存在。如果存在a,那么会更新a中的值为b;如果不存在,则去global variable table中查找是否存在a,如果存在则更新a。如果根本不存在宏变量a,那么将建立一个most local variable(就是说,如果%let语句出现在某个macro function内,那么这个变量仅能够在此macro function内使用。如果是单独的一句%let,那么就是global variable)
现在来看题
- %let a=cat;
- %macro animal;
- %let a=dog;
- %mend;
- %animal
- %put a is &a;
复制代码首先单独的一句%let,建立了一个global macro variable 'a',赋值为'cat'。接着在macro function内又出现了一句%let,此时sas会先在此macro function范围内查找是否存在变量a,结果是不存在。那么sas继续在global macro variable中查找是否存在a,结果是存在,sas将global macro variable 'a'的值更新为dog。由于a是global variable,所以最后输出的结果:a is dog
- %let a=cat;
- %macro animal(a=name);
- %let a=dog;
- %mend;
- %animal(a=dog1);
- %put a is &a;
复制代码这一题,不同的地方是,在macro function内建立了一个local macro variable 'a',那么%let a = dog这一语句只会更新该local macro variable 'a',而不会改变global variable 'a'的值。所以在最后输出global variable 'a'的时候结果依然是'cat'。用以下程序可以很好的显示local和global variable 'a'的值。
- %let a=cat;
- %macro animal(a=name);
- %let a=dog;
- %put local variable a is &a;
- %mend;
- %animal(a=dog1);
- %put global variable a is &a;
复制代码
用以上的思路同样可以解释其他几个例子的输出结果,我就不一一列举了