0

我正在使用Macro Arrays 和 Do Over Macro

我想用 do over 宏重写这段代码:

if mysequence > 4 then grammar_last_5 = grammar_last_4;
if mysequence > 3 then grammar_last_4 = grammar_last_3;
if mysequence > 2 then grammar_last_3 = grammar_last_2;
if mysequence > 1 then grammar_last_2 = grammar_last_1;

所以我的 Do Over 看起来像:

%do_over(values=2-5, phrase= if mysequence > %eval(6-?) then grammar_last_%eval(7-?) = grammar_last_%eval(6-?);)

但这不起作用。

有谁知道如何做到这一点?

谢谢!!亚当

4

3 回答 3

1

对于其他想知道的人,宏似乎可以在此处获得:http: //www.sascommunity.org/wiki/Tight_Looping_with_Macro_Arrays

不过你有问题。您正在尝试将 %eval(6-?) 和其他函数(如文本)传递给 %do_over 宏。它会尝试计算该函数并将结果传递给宏,并且因为它在应该是数学运算中找到了一个字符,所以我猜它随后会发脾气。

更重要的是,一种做你想做的事情的方法似乎不会出现,因为你需要在宏编译器中屏蔽函数,因为你将它作为参数输入,然后将其取消屏蔽到宏编译器实际上被 do_over 使用,我猜 do_over 不会在不重写其逻辑的情况下理解你想要的东西,即使你成功了。

我可以谦虚地建议您自己的宏代码作为起始解决方案。就像是:

%do i = 5 %to 2 %by -1;

if mysequence > %eval(&i - 1) then grammar_last_&i = grammar_last_%eval(&i - 1);
%end;

这应该会产生您想要的文本,尽管您需要将其放入您自己的宏中,并在数据步骤中调用它,因为它在其他任何地方都没有多大意义。

如果你想要更通用的东西,你将不得不让你的手变得更加混乱......

于 2013-05-03T07:13:30.097 回答
0

我快速查看了宏,看起来他们使用了宏引用函数,这可能会干扰%eval函数的执行。

如果是这种情况,那么您将不得不进行自定义编辑%do_over(),以便它不会这样做。如果是这样,那么它可能不值得努力。编写自己的一次性宏来实现目标会更容易。

于 2013-05-02T23:01:50.867 回答
0

你不需要宏,除非你有一些你没有告诉我们的东西。

if mysequence > 4 then grammar_last_5 = grammar_last_4;
if mysequence > 3 then grammar_last_4 = grammar_last_3;
if mysequence > 2 then grammar_last_3 = grammar_last_2;
if mysequence > 1 then grammar_last_2 = grammar_last_1;

->

array  grammars grammar_last:;
do _t = 4 to 1 by -1; *or, _t = dim(grammars)-1 to 1 by -1;
 if mysequence > _t then grammars[_t+1]=grammars[_t];
end;
于 2013-05-03T15:29:25.450 回答