全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
5056 12
2016-07-05

请教SAS advance

题39 of63
%let Mv=shoes;
%macro PORDUCT (Mv=bicycles);
     %let Mv=clothes;
%mend;
%PRODUCT (Mv=tents)
%put Mv is &Mv;

what is written to the SAS log?
答案是 Mv is shoes

比较
%let a =cat;
%macro animal;
   %let a = dog;
%mend;
%animal
%put a is &a;

what is written to SAS log?
a is dog

这两题有什么区别呢?我看了很久的资料还是不理解。 请高手指教! 谢谢!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-7-5 14:06:10
运行以下的程序就可以看出究竟不同的原因在什么地方:
全局宏变量与局部宏变量的作用域不同。
在macro中未定义参数(也就是没有定义参数内局部宏变量),并且在macro中重新为全局宏变量赋值,其值依然是全局宏变量,且值为重新赋值后的值。

%let Mv=shoes;*全局宏变量;
%put Mv1 is &Mv;
%macro PRODUCT(Mv=bicycles);*局部宏变量(参数中定义的局部宏变量);
     %put Mv2 is &Mv;
     %let Mv=clothes;*局部宏变量(macro程序体内定义的宏变量);
     %put Mv3 is &Mv;
%mend;
%product(Mv=tents);
%put Mv4 is &Mv;*全局宏变量;


Mv1 is shoes
Mv2 is tents
Mv3 is clothes
Mv4 is shoes



%let a =cat;*全局宏变量;
%put a1 is &a;
%macro animal;
   %put a2 is &a;
   %let a = dog;*注意:此处实际上仍为全局变量,只是给全局宏变量重新赋值而已,全局变量在宏内赋值,赋值能成功,且该变量依然为全局变量;
   %put a3 is &a;
%mend;
%animal;
%put a4 is &a;*全局变量,打印重新赋值后的值;


a1 is cat
a2 is cat
a3 is dog
a4 is dog
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-7-5 14:20:16
当SAS为一个宏变量赋值时,SAS会从里到外(即从最内层的Local Symbol Table一直到Global Symbol Table)查找该宏变量是否已经存在。如果SAS在某个位置找到了这个宏变量,就会执行赋值操作,查找的动作也随即停止。

前面的例子,修改的是PRODUCT这个宏里的一个局部宏变量;
后面的例子,animal这个宏里没有一个名字是A的local宏变量,所以SAS会修改外层的,也就是global的,宏变量A。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-7-5 23:11:48
这两题的区别在于
     %let Mv=clothes 是局部宏变量
而%let a=cat;是全局宏变量
因为%macro product (mv=bicycles);在macro中定义了mv是局部宏变量,因此接下来的let语句定义的mv都是局部宏变量。如果把这题改一下
%let Mv=shoses;
%macro product;
%let Mv=clothes; *这时let语句定义的为全局宏变量
%mend;
%product;
%put Mv is &Mv;
跑出来的结果为Mv is clothes
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-7-5 23:23:52
cindy2468 发表于 2016-7-5 23:11
这两题的区别在于
     %let Mv=clothes 是局部宏变量
而%let a=cat;是全局宏变量
也就是说 %macro product (mv=bicycles),括号内的这个mv决定了macro中是有局部宏变量的?如果括号内的MV变成其他的,就不会受影响,macro里的程序就没有局部宏变量?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-7-5 23:41:38
wen7014 发表于 2016-7-5 23:23
也就是说 %macro product (mv=bicycles),括号内的这个mv决定了macro中是有局部宏变量的?如果括号内的M ...
是的,可以这么理解。你可以在机器中跑一遍。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群