楼主: 来梦来人
3551 3

[问答] 请教大牛关于宏编译与执行的问题 [推广有奖]

  • 4关注
  • 10粉丝

已卖:1962份资源

副教授

11%

还不是VIP/贵宾

-

威望
0
论坛币
10918 个
通用积分
0.1200
学术水平
17 点
热心指数
22 点
信用等级
18 点
经验
339039 点
帖子
473
精华
0
在线时间
812 小时
注册时间
2011-10-16
最后登录
2019-3-13

楼主
来梦来人 发表于 2012-1-9 14:14:11 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
options symbolgen;
%let Jun=test;
%let Period=%str(May&Jun);
%put Period resolves to: .
%let Period1=%upcase(%str(May&Jun));
%put Period1 resolves to: &period1;
%let Period3=%nrstr(May&Jun);
%put Period3 resolves to: &period3;
%let Period4=%upcase(%nrstr(May&Jun));
%put Period4 resolves to: &period4;
执行上面宏代码:LOG日志为:
1    options symbolgen;
2    %let Jun=test;
3    %let Period=%str(May&Jun);
SYMBOLGEN:  宏变量 JUN 解析为 test
4    %put Period resolves to: .
SYMBOLGEN:  宏变量 PERIOD 解析为 Maytest
SYMBOLGEN:  上一值中宏应引用的某些字符在显示时未加引用。
Period resolves to: Maytest
5    %let Period1=%upcase(%str(May&Jun));
SYMBOLGEN:  宏变量 JUN 解析为 test
6    %put Period1 resolves to: &period1;
SYMBOLGEN:  宏变量 PERIOD1 解析为 MAYTEST
Period1 resolves to: MAYTEST
7    %let Period3=%nrstr(May&Jun);
8    %put Period3 resolves to: &period3;
SYMBOLGEN:  宏变量 PERIOD3 解析为 May&Jun
SYMBOLGEN:  上一值中宏应引用的某些字符在显示时未加引用。
Period3 resolves to: May&Jun
9    %let Period4=%upcase(%nrstr(May&Jun));
SYMBOLGEN:  宏变量 JUN 解析为 test
10   %put Period4 resolves to: &period4;
SYMBOLGEN:  宏变量 PERIOD4 解析为 MAYtest
Period4 resolves to: MAYtest
请教问题1:%str()函数是在宏编译时候起作用而把&Jun解析了?
问题2:为什么%upcase(%nrstr(May&Jun))的结果为MAYtest?
一直困扰,请懂的人解释一下,谢!

二维码

扫码加我 拉你入群

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

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

关键词:resolve options period symbol upcase str period

本帖被以下文库推荐

沙发
webgu 发表于 2012-1-9 15:20:18
1.%str()是对一般的字符及空格,操作符等(不包括%,&),在编译时mask.也就把这些东西仅纯粹当作文本。所以会解析&jun为 test.
2.%nrstr() 除了上面的,还对%,&在编译时mask.但是对运行的结果并不mask. upcase后的结果应该是 MAY&JUN,但是%nrstr() 对结果并不MASK,所以&JUN解析为test,最终结果为MAYtest.
已有 2 人评分经验 学术水平 热心指数 信用等级 收起 理由
eijuhz + 20 精彩帖子
来梦来人 + 1 + 1 + 1 分析的有道理

总评分: 经验 + 20  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

藤椅
来梦来人 发表于 2012-1-9 17:37:00
再请教一下关于%bquote函数的问题:
options symbolgen;
%macro test2(op);
   %if 7 %bquote(&op) 7 %then %put 1;
   %else %put 0;
%mend;
%test2(=)

Log日志为:
1    options symbolgen;
2    %macro test2(op);
3       %if 7 %bquote(&op) 7 %then %put 1;
4       %else %put 0;
5    %mend;
6    %test2(=)
SYMBOLGEN:  宏变量 OP 解析为 =
ERROR: 在需要数值操作数的 %EVAL 函数或 %IF 条件中发现字符操作数。条件是: 7 %bquote(&op) 7
ERROR: 宏 TEST2 将终止执行。
请牛人再解析一下:最后条件部分那一句话是怎么来的?

板凳
webgu 发表于 2012-1-9 22:09:14
编译后“=”被MASK.
你试试这个。
  1. options symbolgen;
  2. %macro test(op);
  3.    %if  %eval(7&op.7) %then %put 1;
  4.    %else %put 0;
  5. %mend;
  6. %test(=)
复制代码
SAS资源
1. SAS 微信:StatsThinking
2. SAS QQ群:348941365

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-29 22:08