Обернуть аргументы функции строкового литерала функции шага DATA в %str()
вместо ''
%let val = %sysfunc(countw(&values.,','));
Должно быть
%let val = %sysfunc(countw(&values.,%str(,)));
Лично, если бы это было присвоение, я слегка ткнул бы профессору в глаза и использовал бы SORTN
процедуру вызова.
Пример:
%macro sortn (values=);
%local nvalues i args comma;
%let nvalues = %sysfunc(countw(&values.,%str(,)));
%do i=1 %to &nvalues;
%local x&i;
%let x&i = %scan(&values.,&i.,%str(,));
%let args = &args &comma x&i;
%Let comma = ,;
%end;
%let comma =;
%syscall sortn(&args);
%do i = 1 %to &nvalues;%superq(comma)%superq(x&i)
%let comma=,;
%end;
%mend sortn;
%put %sortn(values=%str(15,30,16,8,86,98,6,1));
LOG
575 %put %sortn(values=%str(15,30,16,8,86,98,6,1));
1,6,8,15,16,30,86,98
Q2: Это показывает более глубокое понимание макроса, чем предполагалось?