2013-05-02 84 views
0

我正在使用Macro Arrays and Do Over MacroSAS Do Over Macro - Backwards

我想在宏观改写这个代码用做:

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(values=2-5, phrase= if mysequence > %eval(6-?) then grammar_last_%eval(7-?) = grammar_last_%eval(6-?);) 

但是,这并不工作。

有谁知道这可以做到吗?

谢谢! Adam

+0

如果你可以将代码发布到'%do_over'宏观它将帮助。 – 2013-05-02 23:02:42

回答

0

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

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

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; 

这将产生你想要的文字,但你需要把它放在自己的宏,并调用它的数据的步骤,因为这没有多大意义,其他任何地方。

如果你要想要的东西更广义的,你将不得不让你的手非常非常混乱......

+0

嗯,编辑似乎已经取出了亚当原始代码中的“大于”符号... – DJM 2013-05-03 09:04:46

+0

哇,非常感谢你! 这是超级和完美的作品。 只要我获得15点声望,我会立刻报答你。 – Adam 2013-05-03 21:33:13

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;