爲了重構程序,我花了一個複雜的過程來抽象並將其放入宏中。SAS:從數據步驟循環內調用宏
%macro BlackBox();
data _null_;
put "This represents a complex process I want to abstract.";
run;
%mend;
該過程需要連續發生多次,所以顯而易見的解決方案是將其放置在循環中。
data _null_;
do i = 1 to 3;
%BlackBox();
end;
run;
但是,這會產生以下錯誤。
ERROR 117-185: There was 1 unclosed DO block.
發生了什麼事?
我最好的猜測是,SAS試圖運行數據步中的數據的步驟。
我發現我可以在宏封閉我的循環,然後立即調用宏避免這個錯誤。
%macro PerformDoLoop();
%do i = 1 %to 3;
%BlackBox();
%end;
%mend;
%PerformDoLoop;
所有這些看起來像是一個處理基本編程任務的迂迴路線。我希望更多地瞭解爲什麼數據步驟方法失敗會讓我深入瞭解如何更優雅地完成此任務。
請明白,這是用來說明我遇到的錯誤一個簡單的例子。宏的實際實例可能需要參數或返回值。
與往常一樣,謝謝你,喬。爲了解釋我的行爲,宏'%PerformDoLoop'不打算類似於編寫執行循環的方法。從字面上看,執行循環本身。在任何其他語言中,可以在開放代碼中調用循環。在SAS中不是這樣。相反,必須將一個循環包裝在一個'data _null_'中或者一個宏修補程序塊中,如上所述。 實際上,我的BlackBox需要一個參數。由於我需要爲BlackBox調用不同的參數,因此我創建了一個宏列表(作爲僞數組)。然後BlackBox使用數組和循環索引爲不同的參數提供參數。 –
@LoremIpsum如果你打算這樣做,那麼我不會寫循環宏 - 而是創建參數的宏列表,只需創建一個調用BlackBox的宏列表。 我也建議SAS沒有在開放代碼中沒有循環特別獨特;你也不能在C中做到這一點,對於一個特別明顯的例子,它必須在子程序中。 SAS也一樣,它只是強制代碼封裝。也就是說,在SAS 9.5中,它看起來像是允許宏之外的宏流控('%do'等),儘管我不相信這是件好事。 – Joe
有趣點約9.5。我曾在SGF聽到%IF的公開聲明將在9.5。並同意我也不確定這是否是件好事。你有沒有看到有關它將如何實施的早期寫作? – Quentin