我正在使用Macro Arrays and 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(values=2-5, phrase= if mysequence > %eval(6-?) then grammar_last_%eval(7-?) = grammar_last_%eval(6-?);)但这并不管用。
有谁知道如何做到这一点吗?
谢谢!!亚当
发布于 2013-05-03 15:13:30
对于其他想知道的人来说,宏似乎可以在这里获得: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-03 07:01:51
我快速查看了一下宏,发现它们使用了宏引用函数,这可能会干扰您的%eval函数的执行。
如果是这种情况,那么您将不得不自定义编辑%do_over(),这样它就不会这样做。如果是这样的话,可能就不值得这么做了。编写您自己的一次性宏来实现您的目标会更容易。
发布于 2013-05-03 23:29:25
你不需要一个宏,除非你有什么事情没有告诉我们。
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;https://stackoverflow.com/questions/16345430
复制相似问题