我有一个问题要问%macro。 我可以在另一个%macro中设置%macro吗?
简短示例-情况的“图片”
%macro Tier_1();
%do Iter = 1 to &i;
%macro Tier_2()
proc sql noprint;
select
1*&Iter into :var
from work._PRODSAVAIL
;quit;
%put &var;
%mend;
%Tier_2();
%end;
%mend;
%Tier_1();
答案 0 :(得分:3)
您的问题的答案是“是的,有可能。”但这是可怜的风格。如果仅将%Tier_2的宏定义移到宏Tier_1之外,但将调用保留在其中,则将产生与上面相同的结果。
%macro tier_1();
...
%Tier_2();
%mend tier_1();
%macro tier_2();
...
%mend tier_2;
%tier_1();
如您在上面看到的,您甚至不必以特定的方式对它们进行排序-只要在宏执行之前就对它们进行编译就可以了。
只有在外部宏以某种方式修改了内部宏时,才可以将宏定义放入另一个宏定义中,因此必须重新编译该宏。内部宏每次执行外部宏时。
虽然这是一个理论用例,但我认为这不是您在实践中可能会遇到的用例;还有很多其他方法可以在不实际修改宏代码本身的情况下进行修改,因此,它被认为是较差的编程风格,应避免使用。您正在添加(最少,但有一些)开销,但并没有真正的好处,并使代码难以理解。
答案 1 :(得分:2)
这些定义不是逻辑嵌套的。宏名称只有一个空格。如果您在%submacro
和%macroA
内定义相同的%macroB
,则只有一个%submacro
,这是最近一次运行的定义。
您可以嵌套宏CALLS(将宏称为宏的一部分),但是嵌套宏定义的源代码不是一个好主意。您可以做到,但这只会使您感到困惑。