SAS: вызов одного макроса из другого ... порядок определений макросов

в моем коде у меня есть несколько макросов. Макрос A является основным макросом. Макрос вызывает макрос B, который в свою очередь вызывает макрос С.

в SAS, я должен определить их в обратном порядке? Другими словами, должен ли я сначала определить макрос C, затем макрос B, затем макрос a? Или это имеет значение, так как SAS считывает весь код, прежде чем он фактически попадает в команду для запуска макросов? Если на то пошло, могу ли я выполнить команду для запуска макроса в качестве первого оператора в моем коде, а затем определите макросы под командой?

спасибо!

4 ответов


во-первых, вы должны определить макрос, прежде чем он называется.

во-вторых, не имеет значения, где вызывается макрос, если вы загрузили его раньше.

подробнее о вашей проблеме: библиотека autocall-ваш друг. Если администратор SAS не позволяет поместить макросы в библиотеку autocall, можно добавить автозвонок следующим образом:

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 предшествует %level2, который предшествует %level1)

макропеременных: При определении макроса переменные есть два области: глобальные и локальные. После определения, глобальные переменные могут быть доступны в любом месте и в любое время. Однако, локальные переменные существуют только локально, во время выполнения макроса, в котором он был определен. Кроме того, если макрос, в котором определена локальная переменная, вызывает любые другие макросы, локальная переменная макроса по-прежнему будет доступна:

Пример:

в следующем примере макрос определено в обратном порядке заказ чтобы предотвратить возвращение 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, & I возвращает предупреждение, которое делает переменная macro не существует
  • в %level3 при вызове &G1 возвращается значение, хранящееся в локальная область %level3.После выхода за пределы %level3 значение возвращается к значению, хранящемуся глобально