2
A
回答
1
不,一般不會。宏是一個生成SAS代碼的程序,因此要知道它將生成的代碼的唯一方法就是運行它。在一些非常簡單的情況下,您可能能夠解析宏並確定將生成哪些SAS代碼,但對於任何更復雜的情況,您必須重新實現一個程序來讀取,解析並執行此宏上班。另見the Halting Problem。
2
有幾種方法可以達到您想要的效果,至少在某些時候可以工作。
您可以設置options obs=0;
,然後運行宏(開啓MPRINT
)。這將運行宏,但不會處理任何數據行。這將適用於許多宏;但它會覆蓋數據集,所以如果你關心被保存的任何內容,這是不安全的。
%macro do_something;
data test;
set sashelp.class;
run;
%mend do_something;
options mprint;
options obs=0;
%do_something;
WORK.TEST
被覆蓋,注意,但沒有觀察處理。
現在,如果你正在談論一個存儲的編譯宏(這看起來是最有用的場景,不是?),那麼它取決於它是如何存儲的。如果它與/source
交換機一起存儲,那麼您可以使用%COPY
獲得源代碼。
libname sasdir "e:\temp";
options mstored sasmstore=sasdir;
%macro do_something/store source;
data test;
set sashelp.class;
run;
%mend do_something;
%copy do_something/source;
它要求它已經編譯了source
標誌,但是。如果不是,那麼源代碼在運行代碼之前是不可恢復的。
2
另一種方法,如果您的宏主要是數據步和PROC SQL,是使用run cancel;
和proc sql noexec;
選項,例如如下:
%macro example(somelogic=1,execute=NO);
%local cancel noexec;
%if &execute=NO %then %do;
%let cancel=cancel;
%let noexec=noexec;
%end;
data some_ds;
set some_other_ds;
%if &somelogic %then %do;
this=that;
%end;
run &cancel;
proc sql &noexec;
create table maybe as
select * from have;
%mend;
這樣你的代碼將被生成/語法檢查但沒有執行。
當然 - 這是一個'小心處理'的方法,因爲仍然有很多東西在宏觀環境中仍然可以改變。 @Chris Long是正確的 - 沒有執行它的生成SAS代碼沒有可靠的方法(因爲生成的實際代碼通常取決於早期執行的結果)。
0
您可以嘗試使用PROC STREAM。 讓我們定義一個簡單的宏
%macro mymacro;
proc print data=sashelp.class; run;
%mend;
做一個fileref包含生成的代碼
filename mycode temp;
現在你可以使用PROC STREAM
到宏調用轉換爲文本。
proc stream outfile=mycode; BEGIN
%mymacro
;;;;
它應該適用於任何不需要根據它生成的代碼的結果作出決定的宏。
相關問題
- 1. SAS宏執行
- 2. VIM乳膠套件插入宏代碼而不是執行宏
- 3. 將SAS宏分解成僞代碼
- 4. 瞭解SAS宏代碼
- 5. SAS宏代碼到Pig/Hive
- 6. Clojure宏:在宏內部執行代碼
- 7. SAS宏編碼
- 8. 從JavaScript代碼生成SAS令牌?
- 9. 如何執行codeDom生成的代碼?
- 10. 可執行狀態機代碼生成
- 11. Python:如何執行生成的代碼?
- 12. 執行mib2c生成的代碼
- 13. 使用SAS功能執行TeraData代碼
- 14. 在SAS中生成報告的宏
- 15. 編碼PHP而不執行它
- 16. 我如何讓NHibernate只生成SQL而不執行它?
- 17. 我可以訪問生成的查詢而不執行它嗎?
- 18. 如何獲取Pear MDB2生成的SQL而不執行它?
- 19. 生成不生成代碼
- 20. C/C++宏擴展與代碼生成
- 21. 從宏生成並保存代碼
- 22. 如何執行C++代碼而不編譯它?
- 23. 添加大塊代碼而不執行它
- 24. apache2返回PHP源代碼而不是執行它
- 25. C# - 從.NET DLL(類庫)執行代碼而不引用它?
- 26. PHP代碼顯示,而不是執行它
- 27. Javascript顯示代碼而不是執行
- 28. 執行從Rust/Python源代碼生成的LLVM IR代碼
- 29. 從VBA腳本執行宏代碼
- 30. VBA宏代碼停止執行
簡短的回答你可能不想聽到:使用'%put'語句 – user2877959
@ user2877959你的建議將爲小宏做竅門,但不適用於複雜和長期的宏。感謝您的建議 – Arjjuna
因此,爲什麼我預測您不會喜歡答案 – user2877959