楼主: freyabc
1067 3

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

  • 0关注
  • 0粉丝

已卖:17份资源

本科生

89%

还不是VIP/贵宾

-

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

楼主
freyabc 发表于 2023-3-17 10:08:05 |AI写论文

+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
拉您进交流群
GMT+8, 2026-1-6 21:08