我已经为这个问题苦苦挣扎了一段时间。我已经编写了一个宏,让它称为sudo npm i -g eslint
,并且我想在 <中使用macro1
或1989 1990 1995
循环在{} em>打开代码 ,但我无法正常工作。我一直在尝试类似的方法
do
无济于事。有没有人对这个问题有一个方便的解决方案?似乎另一种编程语言可以在3行中完成某些工作(尽管我必须使用SAS作为唯一可用的语言)。任何帮助都会很棒。
答案 0 :(得分:2)
如果您包含创建宏变量所需的%LET
,则您的代码可以在宏定义内运行。并以必需的分号终止您的语句。并省去不必要的分号。
%macro test(years);
%local i next_year;
%do i=1 %to %sysfunc(%countw(&years));
%let next_year = %scan(&years, &i);
%macro1(&next_year)
%end;
%mend test;
%test(1989 1990 1995)
您还可以完全消除不需要的NEXT_YEAR变量。
%macro1(%scan(&years, &i))
真的,您应该避免使用宏编码。坚持学习如何首先编写实际的SAS代码。等待学习如何使用宏生成代码,直到您知道要生成什么代码为止。使用数据步骤的实际语言而不是尝试在宏处理器中进行编码,创建复杂的DO循环要容易得多。
data _null_;
do year=1989, 1990, 1995 ;
call execute(cats('%nrstr(%macro1)(',year,')'));
end;
run;
但是有时墙纸代码比使事情复杂化要容易得多。这是三行程序。
%macro1(1989)
%macro1(1990)
%macro1(1995)