楼主: Eidui
4778 7

[问答] %local and %macro的问题 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

初中生

0%

还不是VIP/贵宾

-

威望
0
论坛币
8 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
48 点
帖子
7
精华
0
在线时间
14 小时
注册时间
2016-9-24
最后登录
2017-3-15

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
请高手解答,这两个code到底是哪里不一样呢?为什么出来的结果不同呢?

62         %let a =cat;
63         %macro animal (a=frog);
64         %let a=bird;
65         %mend;
66         %animal(a=pig)  %put a is &a;
a is cat
67         run;
68         
69         
70         %let a=cat;
71         %macro animal;
72         %let a=bird;
73         %mend;
74         %animal
75         %put a is &a;
a is bird
76         run;

二维码

扫码加我 拉你入群

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

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

关键词:Macro Local acr CRO OCA local

沙发
renjingli2011 发表于 2017-3-13 10:49:13 |只看作者 |坛友微信交流群
由宏的参数指定的宏变量是local宏变量,%let指定的是global宏变量~我这么理解的~

使用道具

藤椅
lovexialulu 发表于 2017-3-13 15:46:06 |只看作者 |坛友微信交流群
加个 options symbolgen mlogic mprint;在运行程序的前面,log显示如下:
******************************************************
81         options symbolgen mlogic mprint;
82         
83           %let a =cat;
84                %macro animal (a=frog);
85                 %let a=bird;
86                 %mend;
87                 %animal(a=pig)
MLOGIC(ANIMAL):  Beginning execution.
MLOGIC(ANIMAL):  Parameter A has value pig
MLOGIC(ANIMAL):  %LET (variable name is A)
MLOGIC(ANIMAL):  Ending execution.
88                  %put a is &a;
SYMBOLGEN:  Macro variable A resolves to cat
a is cat
**********************************************
我的理解是 sas里面逻辑运算 真与假 的问题 导致宏变量&a. 取值问题:
这里第一个程序 你让&a=frog 恒真 才会执行 %macro animal,否则不执行%macro animal。
你的调用 &a=pig 不是取给定的 frog ,so %macro animal 不执行。
你把%animal(a=pig)  换成 %animal(a=frog) ,则会执行宏%animal。
==============================================
下面一个 宏参数为空,即这宏%animal 恒真,不管其他,这宏只要调用 都会100%执行,即执行宏里面的%let a=bird; overwrite了前面的
  %let a =cat;
so




使用道具

板凳
Eidui 发表于 2017-3-14 09:53:13 |只看作者 |坛友微信交流群
renjingli2011 发表于 2017-3-13 10:49
由宏的参数指定的宏变量是local宏变量,%let指定的是global宏变量~我这么理解的~
虽然我也是这么理解的,但是括号里的值总觉得不make sense.

使用道具

报纸
Eidui 发表于 2017-3-14 09:57:09 |只看作者 |坛友微信交流群
lovexialulu 发表于 2017-3-13 15:46
加个 options symbolgen mlogic mprint;在运行程序的前面,log显示如下:
****************************** ...
我可以这样理解吗,因为a的值不是frog也不是pig,所以就返回一开始global设定的值?

使用道具

地板
renjingli2011 发表于 2017-3-14 10:12:16 |只看作者 |坛友微信交流群
Eidui 发表于 2017-3-14 09:53
虽然我也是这么理解的,但是括号里的值总觉得不make sense.
如果你把宏参数从a变成b,结果就跟不设置是一样的,还是你这个宏变量是local的原因~
%let a = cat;
%macro animal(b=frog);
%let a = bird;
%put &a.;
%mend;
%animal(b=pig);
%put a is &a.;
结果是‘a is bird’

使用道具

7
prince315 在职认证  发表于 2017-3-14 10:53:06 |只看作者 |坛友微信交流群
可以尝试运行这么一段:
options symbolgen;

%let a =cat;
%macro animal (a=frog);
%let a=bird;
%put a is &a;
%mend;
%animal(a=pig)  
%put a is &a;


%let a=cat;
%macro animal;
%let a=bird;
%put a is &a;
%mend;
%animal
%put a is &a;

第一段中,括号里a=frog是值在没有给a赋值的时候,默认值是frog的意思。
因为这里有对a的预定义且重名,所以a就是个局部的宏变量。如果在宏内部执行是,输出的a仍是跑的时候,取值变化为
默认frog - 执行传递赋值pig - let语句赋值bird。但到宏执行完毕,局部变量被释放,就开始读取全局宏变量的值cat了。

第二段中,因为没有在宏里面有预定义,就直接在全局宏变量表里面修改了宏变量a的取值,所以宏内宏外取值都被修改,因而值都是bird。

使用道具

8
Apple_L 学生认证  发表于 2020-7-24 14:18:25 |只看作者 |坛友微信交流群
SAS编程技术教程里有讲到宏变量范围这一章节:
“使用全局变量遇到的一些例外:
1.当一个宏变量既存在于全局符号表又存在于局部符号表中时,不能在定义这个变量的宏中引用这个全局变量,因为当遇到&宏变量名称的时候,宏处理器会优先从局部变量符号表中寻找需要解析的宏变量,这时宏处理器就会优先选择引用局部宏变量”
p445~446(第二版)

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 03:50