在另一宏的参数中调用宏的实现方法
解决方案
要实现%mactwo循环中动态传递变量给传入的宏%macone,核心是延迟宏参数的解析时机,让循环变量在每次调用宏时才被替换,而非调用%mactwo时就固定参数值。
方法一:用%nrquote延迟解析
保持%mactwo结构不变,调用时用%nrquote包裹宏调用,阻止变量提前解析:
%macro macone(val=); %put &val; %mend macone; %let lista=vara varb; %let listb=varc vard; %macro mactwo(callmac); %let n = %sysfunc(countw(&lista)); %let v = %sysfunc(countw(&listb)); %do c=1 %to &n; %let nlist = %scan(&lista , &c); %do p=1 %to &v; %let npop = %scan(&listb , &p); &callmac; %end; %end; %mend mactwo; // 用%nrquote包裹,让&nlist和&npop在循环中才解析 %mactwo(%nrquote(%macone(val=&nlist - &npop)));
执行后输出:
vara - varc vara - vard varb - varc varb - vard
若%macone需多参数,同样适用:
%macro macone(val1=, val2=); %put 列表变量:&val1,分组变量:&val2; %mend macone; %mactwo(%nrquote(%macone(val1=&nlist, val2=&npop)));
方法二:传入宏名动态调用
修改%mactwo参数为宏名,在循环中直接指定参数调用,传递更直观:
%macro macone(val=); %put &val; %mend macone; %let lista=vara varb; %let listb=varc vard; %macro mactwo(macname); %let n = %sysfunc(countw(&lista)); %let v = %sysfunc(countw(&listb)); %do c=1 %to &n; %let nlist = %scan(&lista , &c); %do p=1 %to &v; %let npop = %scan(&listb , &p); // 动态调用宏并传递参数 %&macname(val=&nlist - &npop); %end; %end; %mend mactwo; // 直接传入宏名 %mactwo(macone);
内容的提问来源于stack exchange,提问作者Inason
相关产品推荐
相关产品推荐

