SAS Макрос в макросе - PullRequest
       15

SAS Макрос в макросе

0 голосов
/ 09 ноября 2018

У меня есть один вопрос о макросе%. Могу ли я установить% 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();

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Ответ на ваш вопрос: «Да, это возможно».Но это плохой стиль.Аналогичные результаты, приведенные выше, будут иметь место, если вы просто переместите определение макроса для% Tier_2 за пределы макроса Tier_1, но оставите вызов внутри него.

%macro tier_1();

  ... 

  %Tier_2();
%mend tier_1();

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

%tier_1();

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

Единственный раз, когда имеет смысл поместить определение макроса в другое определение макроса, будет, есливнешний макрос каким-то образом изменил внутренний макрос , поэтому необходимо было перекомпилировать внутренний макрос при каждом выполнении внешнего макроса.

Хотя это теоретический вариант использования, я не думаю, что с ним вы, скорее всего, столкнетесь на практике;Есть много других способов изменить вещи без фактического изменения самого макрокода, и поэтому он считается плохим стилем программирования и его следует избегать.Вы добавляете (минимальные, но некоторые) накладные расходы без реальной выгоды и усложняете понимание кода.

0 голосов
/ 09 ноября 2018

Определения НЕ являются логически вложенными. Есть только плоское пространство имен макросов. Если вы определите одно и то же %submacro внутри %macroA и %macroB, будет только один %submacro, определение которого выполнялось совсем недавно.

Вы можете вкладывать макросы CALLS (вызывать макрос как часть макроса), но вложение исходного кода определений макросов не является хорошей идеей. Вы можете сделать это, но это вас просто запутает.

...