全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
979 3
2023-03-17
%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是在执行期起作用,本人实在愚钝,不能理解具体的原因。
请问背后的造成两个宏运行结果不同的具体原因是什么呢?



二维码

扫码加我 拉你入群

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

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

全部回复
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);

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

扫码加我 拉你入群

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

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

2023-3-18 11:45:31
乐天天12300 发表于 2023-3-18 10:10
%let ss=sashelp.class;

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

扫码加我 拉你入群

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

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

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);
二维码

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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