在年份列表中执行宏

Executing a macro over a list of years

我已经为这个问题苦苦挣扎了一段时间。我写了一个宏,我们称之为 macro1,我想在年份列表中 运行 假设 1989 1990 1995 使用 do%do 循环打开代码 但我无法让它工作。我一直在尝试

%let years = 1989 1990 1995
%local i next_year
%do i=1 %to %sysfunc(%countw(&years));
    next_year = %scan(&years, &i);
    %macro1(&next_year);
%end

无济于事。有没有人有解决这个问题的方便方法?这似乎是另一种编程语言能够在 3 行中完成的事情(我必须使用 SAS,尽管它是唯一可用的语言)。任何帮助都会很棒。

如果包含创建宏变量所需的 %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)