【问题标题】:SAS Macro in macro宏中的 SAS 宏
【发布时间】:2019-04-13 08:40:03
【问题描述】:

我有一个关于 %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();

【问题讨论】:

  • 你可以 - 但你不应该。
  • 别这样。只是不要。

标签: sas sas-macro


【解决方案1】:

定义不是逻辑嵌套的。只有一个宏名称的平坦空间。如果您在 %macroA%macroB 内定义相同的 %submacro,则将只有一个 %submacro,这是最近运行的定义。

您可以嵌套宏 CALLS(将宏作为宏的一部分调用),但嵌套宏定义的源代码并不是一个好主意。你可以做到,但这只会让你感到困惑。

【讨论】:

    【解决方案2】:

    您的问题的答案是“是的,有可能”。但是画风很差。如果您只是将 %Tier_2 的宏定义移到宏 Tier_1 之外,但将调用留在其中,则会出现与上述相同的结果。

    %macro tier_1();
    
      ... 
    
      %Tier_2();
    %mend tier_1();
    
    %macro tier_2();
      ...
    %mend tier_2;
    
    %tier_1();
    

    正如您在上面看到的,您甚至不必以特定方式对它们进行排序 - 只要在执行宏之前编译它们就可以正常工作。

    将一个宏定义放入另一个宏定义中唯一有意义的情况是外部宏以某种方式修改了内部宏,因此有必要重新编译每次外部宏执行时内部宏。

    虽然这是一个理论上的用例,但我认为您在实践中不太可能遇到这种情况;还有很多其他方法可以在不实际修改宏代码本身的情况下进行修改,因此它被认为是糟糕的编程风格,应该避免。你增加了(最小的,但一些)开销而没有真正的好处,并且使代码更难理解。

    【讨论】:

    • 感谢大家的回答。明天我将准备并在我的应用程序中展示我的一般问题点 - 也许我没有好的方法,知道如何解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多