楼主: cindy2468
3568 15

[学习分享] advance 63题39 [推广有奖]

11
cindy2468 发表于 2016-7-5 22:02:11
920240553 发表于 2016-7-5 09:57
%let Mv=clothes定义在宏的内部,所以是局部宏变量,在宏之外才是全局的。
可是你举的例子  %let a = dog;也是定义在macro内,为何这个是全局宏变量

12
cindy2468 发表于 2016-7-5 22:02:21
920240553 发表于 2016-7-5 09:57
%let Mv=clothes定义在宏的内部,所以是局部宏变量,在宏之外才是全局的。
可是你举的例子  %let a = dog;也是定义在macro内,为何这个是全局宏变量

13
cindy2468 发表于 2016-7-5 22:03:09
920240553 发表于 2016-7-5 09:57
%let Mv=clothes定义在宏的内部,所以是局部宏变量,在宏之外才是全局的。
可是你举的例子  %let a = dog;也是定义在macro内,为何这个是全局宏变量

14
cindy2468 发表于 2016-7-5 23:06:12
cindy2468 发表于 2016-7-5 22:02
可是你举的例子  %let a = dog;也是定义在macro内,为何这个是全局宏变量
因为%macro product (mv=bicycles);在macro中定义了mv,所以紧跟着的let语句产生的宏变量就是局部宏变量,是这么理解吗?

15
pobel 在职认证  发表于 2016-7-6 07:55:00
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

16
920240553 发表于 2016-7-6 09:16:16
cindy2468 发表于 2016-7-5 23:06
因为%macro product (mv=bicycles);在macro中定义了mv,所以紧跟着的let语句产生的宏变量就是局部宏变量, ...
%macro product (mv=bicycles);参数中的mv就是定义的局部宏变量。
在macro中如果想把全局变量强制变成局部宏变量,可以用%local语句进行定义,这样全局中的宏变量在程序体中就变成局部宏变量了,其实也很好理解的。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 12:56