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