Существует два типа параметров макроса: позиционные и с ключами.
Позиционные параметры
Позиционные параметры используются для передачи значений параметров в соответствии с положением параметра в определении макроса и при вызове. Порядок указания параметров должен соответствовать порядку, в котором они указаны в инструкции %MACRO. При указании нескольких позиционных параметров используйте запятую для разделения параметров. Если параметр не указан, соответствующей переменной макроса, указанной в инструкции %MACRO, присваивается значение null.
Пример приведен ниже:
%macro test(var1,var2,var3);
%put &=var1;
%put &=var2;
%put &=var3;
%mend test;
/** Each value corresponds to the position of each variable in the definition. **/
/** Here, I am passing numeric values. **/
%test(1,2,3)
/** The first position matches with var1 and is given a null value. **/
%test(,2,3)
/** I pass no values, so var1-var3 are created with null values. **/
%test()
/** The first value contains a comma, so I use %STR to mask the comma. **/
/** Otherwise, I would receive an error similar to this: ERROR: More **/
/** positional parameters found than defined. **/
%test(%str(1,1.1),2,3)
/** Each value corresponds to the position of each variable in the definition. **/
/** Here, I am passing character values. **/
%test(a,b,c)
/** I gave the first (var1) and second (var2) positions a value of **/
/** b and c, so var3 is left with a null value. **/
%test(b,c)
Результат запуска:
173 /** Each value corresponds to the position of each variable in the definition. **/
174 /** Here, I am passing numeric values. **/
175 %test(1,2,3)
VAR1=1
VAR2=2
VAR3=3
176 /** The first position matches with var1 and is given a null value. **/
177 %test(,2,3)
VAR1=
VAR2=2
VAR3=3
178 /** I pass no values, so var1-var3 are created with null values. **/
179 %test()
VAR1=
VAR2=
VAR3=
180 /** The first value contains a comma, so I use %STR to mask the comma. **/
181 /** Otherwise, I would receive an error similar to this: ERROR: More **/
182 /** positional parameters found than defined. **/
183 %test(%str(1,1.1),2,3)
VAR1=1,1.1
VAR2=2
VAR3=3
184 /** Each value corresponds to the position of each variable in the definition. **/
185 /** Here, I am passing character values. **/
186 %test(a,b,c)
VAR1=a
VAR2=b
VAR3=c
187 /** I gave the first (var1) and second (var2) positions a value of **/
188 /** b and c, so var3 is left with a null value. **/
189 %test(b,c)
VAR1=b
VAR2=c
VAR3=
Параметры с ключами
Преимущество использования параметров с ключами — возможность указать значение по умолчанию для переменных макроса в определении макроса. При использовании параметров с ключами необходимо указать знак равенства после имени макропеременной.
Пример приведен ниже:
%macro test(color=blue,id=123);
%put &=color;
%put &=id;
%mend test;
/** Values passed to the macro overwrite default values from the definition. **/
%test(color=red,id=456)
/** Passing in no values allows the default values to take precedence. **/
%test()
/** You are not required to pass in a value for each keyword parameter. **/
%test(color=green)
/** The order of variables does not matter. **/
%test(id=789,color=yellow)
Результат запуска:
270 /** Values passed to the macro overwrite default values from the definition. **/
271 %test(color=red,id=456)
COLOR=red
ID=456
272 /** Passing in no values allows the default values to take precedence. **/
273 %test()
COLOR=blue
ID=123
274 /** You are not required to pass in a value for each keyword parameter. **/
275 %test(color=green)
COLOR=green
ID=123
276 /** The order of variables does not matter. **/
277 %test(id=789,color=yellow)
COLOR=yellow
ID=789
Если в определении макроса используются и позиционные параметры, и параметры с ключами, позиционные параметры должны идти первыми. В противном случае появится следующая ошибка:
ERROR: All positional parameters must precede keyword parameters.
Пример приведен ниже:
%macro test(val,color=blue,id=123); %put &=color; %put &=id; %put &=val; %mend test; /** The positional parameter is listed first. **/ %test(1,color=red,id=456) Here are the log results: 318 /** The positional parameter is listed first. **/
319 %test(1,color=red,id=456) COLOR=red ID=456 VAL=1
PARMBUFF
Параметр PARMBUFF создает переменную макроса &SYSPBUFF, которая содержит весь список значений параметров, включая круглые скобки. Это позволяет передавать переменное число значений. В следующем примере вы можете передать макросу любое количество параметров. В следующем примере показано, как проанализировать каждое слово в списке параметров:
%macro makes/parmbuff;
/** The COUNTW function counts the number of words within &SYSPBUFF. **/
%let cnt=%sysfunc(countw(&syspbuff));
/** The %DO loop increments based on the number of words returned to the macro. **/
/** variable &CNT. **/
%do i= 1 %to &cnt;
/** The %SCAN function extracts each word from &SYSPBUFF. **/
%let make=%scan(&syspbuff,&i);
%put &make;
%end;
%mend makes;
%makes(toyota,ford,chevy)
Результат запуска:
19 %macro makes/parmbuff;
20 /** The COUNTW function counts the number of words within &SYSPBUFF. **/
21 %let cnt=%sysfunc(countw(&syspbuff));
22 /** The %DO loop increments based on the number of words returned to the macro **/
23 /** variable &CNT. **/
24 %do i= 1 %to &cnt;
25 /** The %SCAN function extracts each word from &SYSPBUFF. **/
26 %let make=%scan(&syspbuff,&i);
27 %put &make;
28 %end;
29 %mend makes;
30
31 %makes(toyota,ford,chevy)
toyota
ford
chevy
Если указан параметр PARMBUFF и определение макроса включает в себя как позиционные, так и ключевые параметры, параметры все равно получают значения при вызове макроса. В этом случае весь список вызовов присваивается &SYSPBUFF. Пример приведен ниже:
%macro test(b,a=300)/parmbuff;
%put &=syspbuff;
%put _local_;
%mend;
%test(200,a=100)
Результат запуска:
SYSPBUFF=(200,a=100)
TEST A 100
TEST B 200
Обратите внимание, что &SYSPBUFF включает весь список параметров (включая круглые скобки), но каждый отдельный параметр все равно получает собственное значение.
Если вам нужно знать все значения параметров, которые передаются макросу, укажите параметр PARMBUFF в определении макроса, чтобы получить доступ к &SYSPBUFF, который содержит все значения параметров. Дополнительную информацию о PARMBUFF, см. в разделе Выражение %MACRO в статье SAS® 9.4, язык макросов: справочник, пятое издание.
Надеюсь, эта статья помогла вам понять, как передать значения макросу.