Другой вариант - определить переменные как макропараметры в строке оператора макроса. Ниже приведена простая программа, которая создает глобальную макропеременную с именем DATE, а затем определяет макрос с параметром, который также называется DATE. Кроме того, макрос вызывает себя с другим значением даты (1).
options nosource nonotes;
%let date = '01jan2011'd;
%put Global DATE = &date;
%******************************************************************************;
%macro test_macro_level(date=,nest_level=);
%put INSIDE MACRO - Nest Level=&nest_level : DATE=&date;
%if %eval(&nest_level = 1) %then %do;
%test_macro_level(date='01mar2011'd,nest_level=2);
%put INSIDE MACRO, AFTER NESTING - Nest Level=&nest_level : DATE=&date;
%end;
%mend test_macro_level;
%******************************************************************************;
%test_macro_level(date='01feb2011'd,nest_level=1);
%put Return to Global: Date=&date;
Файл журнала выглядит так:
Global DATE = '01jan2011'd
INSIDE MACRO - Nest Level=1 : DATE='01feb2011'd
INSIDE MACRO - Nest Level=2 : DATE='01mar2011'd
INSIDE MACRO, AFTER NESTING - Nest Level=1 : DATE='01feb2011'd
Return to Global: Date='01jan2011'd
(1) Обратите внимание, что итеративный макрос предназначен только для примера и никоим образом не должен загрязнять ваш собственный код.