全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3457 15
2016-07-01
悬赏 50 个论坛币 已解决
The following SAS program is submitted:
%let Mv=shoes;
%macro PRODUCT(Mv=bicycles);
%let Mv=clothes;
%mend;
%PRODUCT(Mv=tents)
%put Mv is &Mv;
What is written to the SAS log?
答案是mv is shoes
为何答案不是mv is clothes?为何mv的值没有被覆盖呢?谢谢

最佳答案

920240553 查看完整内容

相当于在macro程序体内为全局宏变量重新赋值了,而且最终的结果就是赋值后的值,实际上仍然是全局宏变量。参考以下的程序例程: 全局宏变量与局部宏变量的作用域不同。 在macro中未定义参数(也就是没有定义参数内局部宏变量),并且在macro中重新为全局宏变量赋值,其值依然是全局宏变量,且值为重新赋值后的值。 %let Mv=shoes;*全局宏变量; %put Mv1 is &Mv; %macro PRODUCT(Mv=bicycles);*局部宏变量(参数中定义的局 ...
二维码

扫码加我 拉你入群

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

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

全部回复
2016-7-1 12:27:32
cindy2468 发表于 2016-7-5 12:17
谢谢回复!请看下面的例子,为何宏内的let语句生成的变量值可以覆盖全局宏变量的值呢?
%let city=Sydne ...
相当于在macro程序体内为全局宏变量重新赋值了,而且最终的结果就是赋值后的值,实际上仍然是全局宏变量。参考以下的程序例程:
全局宏变量与局部宏变量的作用域不同。
在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-1 12:44:48
%macro外的%let创建的是全局宏变量,%macro内产生的是局部宏变量。

%macro PRODUCT(Mv=bicycles);
%let Mv=clothes;
%mend;
%PRODUCT(Mv=tents)
%put Mv is &Mv;
日志:WARNING: 没有解析符号引用 MV。
Mv is &Mv
%macro PRODUCT(Mv=bicycles);
%let Mv=clothes;
%put Mv is &Mv;
%mend;
%PRODUCT(Mv=tents)
日志:Mv is clothes

二维码

扫码加我 拉你入群

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

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

2016-7-1 20:25:08
首先,“%let Mv=shoes;“建立了一个全局宏变量,变量名为mv,值为shoes。

接着
%macro PRODUCT(Mv=bicycles);
%let Mv=clothes;
%mend;
%PRODUCT(Mv=tents)

建立了一个局部宏变量mv,其值为tents

最后“%put Mv is &Mv;”,解析时,首先从全局宏变量寻找是否有mv(本例中已有),如果没有全局宏变量,然后再从局部宏变量中找是否有mv。

所以解析以后mv是全局宏变量,且mv=shoes
二维码

扫码加我 拉你入群

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

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

2016-7-5 04:39:32
8112mmw 发表于 2016-7-1 20:25
首先,“%let Mv=shoes;“建立了一个全局宏变量,变量名为mv,值为shoes。

接着
那在macro中的%let Mv=clothes为何不是全局宏变量 谢谢您的耐心解答
二维码

扫码加我 拉你入群

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

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

2016-7-5 09:57:00
cindy2468 发表于 2016-7-5 04:39
那在macro中的%let Mv=clothes为何不是全局宏变量 谢谢您的耐心解答
%let Mv=clothes定义在宏的内部,所以是局部宏变量,在宏之外才是全局的。
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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