2013-05-02 79 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;