宏中的 SAS 宏
SAS Macro in macro
我有一个关于 %macro 的问题。
我可以在另一个 %macro 中设置 %macro 吗?
简短示例 - "picture" 情况:
%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();
这些定义在逻辑上没有嵌套。只有一个 space 的宏名称。如果您在 %macroA
和 %macroB
中定义了相同的 %submacro
,则只会有一个 %submacro
,即最近定义的 运行。
您可以嵌套宏 CALLS(调用宏作为宏的一部分),但嵌套宏定义的源代码不是一个好主意。你可以做到,但这只会让你感到困惑。
你的问题的答案是"yes, it is possible."但它的风格很差。如果您只是将 %Tier_2 的宏定义移到宏 Tier_1 之外,但将调用留在其中。
%macro tier_1();
...
%Tier_2();
%mend tier_1();
%macro tier_2();
...
%mend tier_2;
%tier_1();
正如您在上面看到的,您甚至不必以特定方式对它们进行排序 - 只要在执行宏之前编译它们就可以正常工作。
只有当外部宏以某种方式修改内部宏时,将一个宏定义放在另一个宏定义中才有意义,因此有必要每次执行外部宏时重新编译内部宏。
虽然这是一个理论上的用例,但我认为您在实践中可能不会遇到这种情况;有很多其他方法可以在不实际修改宏代码本身的情况下修改事物,因此它被认为是糟糕的编程风格,应该避免。您添加(很少,但有些)开销没有真正的好处,并且使代码更难理解。
我有一个关于 %macro 的问题。 我可以在另一个 %macro 中设置 %macro 吗?
简短示例 - "picture" 情况:
%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();
这些定义在逻辑上没有嵌套。只有一个 space 的宏名称。如果您在 %macroA
和 %macroB
中定义了相同的 %submacro
,则只会有一个 %submacro
,即最近定义的 运行。
您可以嵌套宏 CALLS(调用宏作为宏的一部分),但嵌套宏定义的源代码不是一个好主意。你可以做到,但这只会让你感到困惑。
你的问题的答案是"yes, it is possible."但它的风格很差。如果您只是将 %Tier_2 的宏定义移到宏 Tier_1 之外,但将调用留在其中。
%macro tier_1();
...
%Tier_2();
%mend tier_1();
%macro tier_2();
...
%mend tier_2;
%tier_1();
正如您在上面看到的,您甚至不必以特定方式对它们进行排序 - 只要在执行宏之前编译它们就可以正常工作。
只有当外部宏以某种方式修改内部宏时,将一个宏定义放在另一个宏定义中才有意义,因此有必要每次执行外部宏时重新编译内部宏。
虽然这是一个理论上的用例,但我认为您在实践中可能不会遇到这种情况;有很多其他方法可以在不实际修改宏代码本身的情况下修改事物,因此它被认为是糟糕的编程风格,应该避免。您添加(很少,但有些)开销没有真正的好处,并且使代码更难理解。