楼主: freyabc
398 3

[问答] 关于%superq的使用 [推广有奖]

  • 0关注
  • 0粉丝

本科生

82%

还不是VIP/贵宾

-

威望
0
论坛币
68 个
通用积分
1.6666
学术水平
15 点
热心指数
17 点
信用等级
14 点
经验
1248 点
帖子
44
精华
0
在线时间
178 小时
注册时间
2022-7-28
最后登录
2024-4-23

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
%let ss=sashelp.class;

%macro test1();
        %put %superq(&ss.);
        %put 这是一个间隔;
        %if %sysfunc(exist(%superq(&ss.))) eq 1 %then %do;
                %put 已解析;
        %end;
%mend;

%test1();

%macro test2(parm);
        %put %superq(parm);
        %put 这是一个间隔;
        %if %sysfunc(exist(%superq(parm))) eq 1 %then %do;
                %put 已解析;
        %end;
%mend;

%test2(&ss.);

上述两个宏,test2可以解析%ss.宏变量下数据集的存在,且在put过程没有报错;而单纯将&ss.从宏参数的位置转移到宏内,却无法put出正确的宏变量,且可以在有报错的情况下put出“已解析”的语句。
有一种解释说%superq是在执行期起作用,本人实在愚钝,不能理解具体的原因。
请问背后的造成两个宏运行结果不同的具体原因是什么呢?



二维码

扫码加我 拉你入群

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

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

关键词:super supe sysfunc SASHELP exist

回帖推荐

乐天天12300 发表于2楼  查看完整内容

%let ss=sashelp.class; %macro test1(); %put %superq(ss); %put 这是一个间隔; %if %sysfunc(exist(%superq(ss))) eq 1 %then %do; %put 已解析; %end; %mend; %test1(); %macro test2(parm); %put %superq(&parm.); %put 这是一个间隔; %if %sysfunc(exist(%superq(&parm.))) eq 1 %then %do; %put 已解析; ...
沙发
乐天天12300 发表于 2023-3-18 10:10:27 |只看作者 |坛友微信交流群
%let ss=sashelp.class;

%macro test1();
        %put %superq(ss);
        %put 这是一个间隔;
        %if %sysfunc(exist(%superq(ss))) eq 1 %then %do;
                %put 已解析;
        %end;
%mend;

%test1();

%macro test2(parm);
        %put %superq(&parm.);
        %put 这是一个间隔;
        %if %sysfunc(exist(%superq(&parm.))) eq 1 %then %do;
                %put 已解析;
        %end;
%mend;

%test2(ss);

如果你是个成熟的程序员,请反思。

使用道具

藤椅
freyabc 发表于 2023-3-18 11:45:31 |只看作者 |坛友微信交流群
乐天天12300 发表于 2023-3-18 10:10
%let ss=sashelp.class;

%macro test1();
哦吼,膜拜大佬!
%superq(macrovar)等价于&macrovar.,这样理解对吗?

使用道具

板凳
乐天天12300 发表于 2023-3-19 13:34:08 |只看作者 |坛友微信交流群
freyabc 发表于 2023-3-18 11:45
哦吼,膜拜大佬!
%superq(macrovar)等价于&macrovar.,这样理解对吗?
是%superq(macrovar) 中的macrovar等价于&macrovar。%superq的作用是阻止对&macrovar的值进一步解析。


%let a=&c.;

/*warning*/
%put &a.;

/*no warning*/
%put %superq(a);

使用道具

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

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

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

GMT+8, 2024-4-25 21:46