cindy2468 发表于 2016-7-5 23:06 
因为%macro product (mv=bicycles);在macro中定义了mv,所以紧跟着的let语句产生的宏变量就是局部宏变量, ...
宏里面的%let语句作用的位置是要看宏的local symbol table里是不是有这个宏变量。
1. 如果这个宏变量属于宏定义的局部变量,那这个%let就不会影响全局的变量值;
2. 如果这个宏变量没有在宏里面定义为local,那%let就会修改宏外面的变量值。
%let Mv=shoes;
%macro PRODUCT(Mv4=bicycles);
%let Mv=clothes;
%mend;
%product(Mv4=tents);
%put Mv is &Mv;
总之,%let语句会从它所在的位置,由内到外去查找宏变量,如果在在local symbol table里找到,那就修改local宏变量的值;如果local里没有,而global里有,那就修改global的值; 如果local和global都没有,那就在所在位置创建一个新变量(%let在宏里的话就新建一个local变量)。
如果有兴趣可以看看:
https://bbs.pinggu.org/thread-2845461-1-1.html