在我的代码我有几个宏。宏一个是主要的宏观。宏观一再呼吁宏B这反过来呼吁的宏C。

SAS,我必须界定它们在后顺序?换句话说,我有义宏C第一,然后宏B,则宏一个持续多久?或者这很重要,因为SAS读取所有的代码在它面前的实际命运行命令的宏?对于这个问题,我可以问题的命令来运行的宏作为第一次发言,在我的代码然后再定义的宏下的命令?

谢谢!

有帮助吗?

解决方案

首先,必须将其称为前定义一个宏。

二,没关系,其中宏,只要你以前手加载它援引。

要详细说明你的问题:自动调用库是你的朋友。如果SAS管理员不会让你把你的宏中自动调用库,可以追加自动调用像这样:

filename mymacros 'c:\mysas'; 
/*this defines the directory you have stored your macros*/

options sasautos=(sasautos mymacros) mautosource; 

其他提示

宏有它被调用之前被定义。出于性能的考虑,最好不要定义内的另一个宏观 - 如果你这样做,那么它将被重新定义每次调用外部宏观时间。以下工作精细:

%macro a;
  %put a;
  %b
%mend a;

%macro b;
  %put b;
  %c
%mend b;

%macro c;
  %put c;
%mend c;

%*-- %a is main --*;
%a
/* on log
a
b
c
*/

您必须定义一个宏,它被调用之前,所以用“%A”的线将需要遵循宏观A.定义其他宏定义的顺序并不重要,只要他们在他们之前定义叫做。通常,在我的节目我设置了一个主宏像你描述的,那么程序的最后一行调用此宏。

考虑另一种方法是建立一个宏自动调用库,其中包含许多宏的定义。这最适合可重复使用的宏,这样你就不必重新定义他们在每一个程序。

有两个方面的宏代码在SAS被定义的:宏代码,以获取汇编和宏观参数:

宏代码:

宏代码本身是很简单的在于当 %macro 令牌遇到的SAS系统开始编制一SAS宏观,并保持编制,直到达到一个 %mend 令牌。只有真正的问题,你可以拿出反对的是如果您更新宏代码,不要重新编译之前执行它在这些情况下,它仍然运行的旧版本,它已经在宏图书馆。通过扩展,如果你尝试编制一宏电话的另一种宏其尚未定义,然后你会得到一个错误。由于这些原因,他们需要被编程中以它们被称为(如下面的例子:%level3先%2级,其来之前%1级)

宏观变量: 当定义的宏观 变量 有两种范围:全球和地方。一旦定义,全球变量可以在任何地方进行访问并在任何时间。然而,当地的变量只存在于本地的执行过程中的宏它在其中已被定义。通过扩展,如果宏在哪里的地方变量已经定义呼吁的任何其他宏,当地的宏观变量仍然会问:

工作的例子:

在下面的例子中,宏是 定义在顺序相反 防止SAS返回 显而易见的援用的宏 警告。

以下图说明的结构如下宏在以下例子:

|-----------------------------|
|GLOBAL                       |
|  |------------------------| |
|  |LEVEL1                  | |
|  |  |-------------------| | |
|  |  |LEVEL2             | | |
|  |  |  |--------------| | | |
|  |  |  |  LEVEL3      | | | |
|  |  |  |--------------| | | |
|  |  |-------------------| | |
|  |------------------------| |
|-----------------------------|

汇编的嵌套宏:

 %macro level3 ;
  %put **** START LEVEL3 **** ;
  %local G1;
  %let G1=Local ;

  %do i=1 %to 2 ;
    %put In the macro do loop I=&i ;
  %end ;

  %put The value of I at level3 is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL3 ****;
%mend level3 ;


 %macro level2 ;
  %put **** START LEVEL2 **** ;
  %*global L1 ; *<-- this would produce an error because the variable name has already been added to the local scope in %level1 ;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level3 ;

  %put The value of I in level2 is: &I ;
  %put **** END LEVEL2 ****;
%mend level2 ;

汇编的顶级的宏(这又呼吁上述两个宏)和运行:

%let G1=Global;
%macro level1 ;
  %put **** START LEVEL1 **** ;
  %let L1=Yes;

  %put Are we accessing global or local G1 variable here: &G1 ;
  %put Can we access local variables here: &L1 ;

  %level2 ;

  %put The value of I outside of the local macro is: &I ;
  %put Are we accessing global or local G1 variable here: &G1 ;

  %put **** END LEVEL1 ****;
%mend level1 ;
%level1 ;

需要注意的事项时审查日志:

  • 外%level3,我返回一个警告,说明宏观变量做 不存在
  • 内%level3,当&G1是称为,返回的价值存在 地方范围%level3.一旦外%level3,值返回 值储存的全球
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top