使用宏变量名调用宏
Invoke a Macro Using A Macro Variable Name
在 SAS 中是否可以使用值为宏名称的宏变量来调用对宏的调用?类似于以下内容:
%MACRO TEST (macroName, var1, var2, var3, var4, var5);
%put LOG: %¯oName(&var1);
%MEND;
%TEST(testName,testVar1);
回应理查德的回答。我尝试按照您的解决方案进行操作,但仍然使用以下代码获得 "apparent invocation of macro YearMonthString not resolved":
%MACRO YearMonthString(nYear,nMonth);
/* Builds a string in the format YYYYMM using passed nYear and nMonth */
%local returnVal;
/*Build the string */
%let returnVal = &nYear.%AddLeadingZerosToMakeNumXLength(2,&nMonth);
/*Write to LOG */
%put MACRO LOG: YearMonthString(nYear= &nYear, nMonth= &nMonth) will return &returnVal;
/* return returnVal */
&returnVal
%MEND;
%MACRO TEST (macroName, var1, var2, var3, var4, var5);
%local loopCount;
%let loopCount = 1;
%do i=1 %to 13;
%¯oName.(&var1,&loopCount);
%let loopCount = %eval(&loopCount+1);
%end;
%MEND;
%TEST(YearMonthString,2018,8,,,);
是的,你可以!构造是 %
&
macro-symbol。这是一个演示:
%macro one();
%put &SYSMACRONAME;
%mend;
%macro two();
%put &SYSMACRONAME;
%mend;
%macro dispatch (routine);
%&routine.()
%mend;
%dispatch (one)
%dispatch (two)
---- LOG ----
13 %dispatch (one)
ONE
14 %dispatch (two)
TWO
在 SAS 中是否可以使用值为宏名称的宏变量来调用对宏的调用?类似于以下内容:
%MACRO TEST (macroName, var1, var2, var3, var4, var5);
%put LOG: %¯oName(&var1);
%MEND;
%TEST(testName,testVar1);
回应理查德的回答。我尝试按照您的解决方案进行操作,但仍然使用以下代码获得 "apparent invocation of macro YearMonthString not resolved":
%MACRO YearMonthString(nYear,nMonth);
/* Builds a string in the format YYYYMM using passed nYear and nMonth */
%local returnVal;
/*Build the string */
%let returnVal = &nYear.%AddLeadingZerosToMakeNumXLength(2,&nMonth);
/*Write to LOG */
%put MACRO LOG: YearMonthString(nYear= &nYear, nMonth= &nMonth) will return &returnVal;
/* return returnVal */
&returnVal
%MEND;
%MACRO TEST (macroName, var1, var2, var3, var4, var5);
%local loopCount;
%let loopCount = 1;
%do i=1 %to 13;
%¯oName.(&var1,&loopCount);
%let loopCount = %eval(&loopCount+1);
%end;
%MEND;
%TEST(YearMonthString,2018,8,,,);
是的,你可以!构造是 %
&
macro-symbol。这是一个演示:
%macro one();
%put &SYSMACRONAME;
%mend;
%macro two();
%put &SYSMACRONAME;
%mend;
%macro dispatch (routine);
%&routine.()
%mend;
%dispatch (one)
%dispatch (two)
---- LOG ----
13 %dispatch (one)
ONE
14 %dispatch (two)
TWO