It doesn't seem to work.
When I run the macro I got the following in the log:
1 %main_macro;
MLOGIC(MAIN_MACRO): Beginning execution.
MPRINT(MAIN_MACRO): DATA RESULT;
MPRINT(MAIN_MACRO): SET base3;
MPRINT(MAIN_MACRO): ARRAY RULE[*] Rule:;
MPRINT(MAIN_MACRO): ARRAY RESULT[5] RESULT1-RESULT5;
MPRINT(MAIN_MACRO): DO i=1 to 5;
MPRINT(MAIN_MACRO): temp_result = CATS("Rule",i);
MPRINT(MAIN_MACRO): call symputx("temp_result_macro",temp_result,"G");
MPRINT(MAIN_MACRO): call symputx("index",i,"G");
MPRINT(MAIN_MACRO): if RULE[i] = 1 then do;
MPRINT(MAIN_MACRO): call execute('%another_macro(&temp_result_macro,&index)');
SYMBOLGEN: && resolves to &.
WARNING: Apparent symbolic reference INDEX not resolved.
SYMBOLGEN: Unable to resolve the macro variable reference &index
NOTE: Line generated by the macro variable "INDEX".
1 &point_&
-
22
WARNING: Apparent symbolic reference POINT_ not resolved.
WARNING: Apparent symbolic reference INDEX not resolved.
NOTE 137-205: Line generated by the invoked macro "MAIN_MACRO".
3 ('%another_macro(&temp_result_macro,&index)'); result[i] = &&point_&index.; end; end; run;
------
22
ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant,
a datetime constant, a missing value, INPUT, PUT.
ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant,
a datetime constant, a missing value, arrayname, (, +, -, INPUT, NOT, PUT, ^, _NEW_, ~.
NOTE: Line generated by the invoked macro "MAIN_MACRO".
3 ('%another_macro(&temp_result_macro,&index)'); result[i] = &&point_&index.; end; end; run;
------
201
ERROR 201-322: The option is not recognized and will be ignored.
MPRINT(MAIN_MACRO): result[i] = &point_& index.;
MPRINT(MAIN_MACRO): end;
MPRINT(MAIN_MACRO): end;
MPRINT(MAIN_MACRO): run;
INFO: Character variables have defaulted to a length of 200 at the places given by: (Line):(Column).
Truncation can result.
2:65 temp_result
NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.RESULT may be incomplete. When this step was stopped there were 0
observations and 14 variables.
WARNING: Data set WORK.RESULT was not replaced because this step was stopped.
NOTE: DATA statement used (Total process time):
real time 0.01 seconds
cpu time 0.00 seconds
MLOGIC(MAIN_MACRO): Ending execution.
Basically, the reason it does _not_ work is bad "timing" in the program logic.
The:
call execute('%another_macro(&temp_result_macro,&index)');
line executes after the:
result[i] = &&point_&index.;
line needs it.
Call Execute() executes long after you need its results, if you run:
data _null_;
call execute('proc sql; select sum(age) into: S_A from sashelp.class; quit;');
x = "&S_A.";
run;
the log will show warning about not resolved symbol in compilation phase of the data step, long before SQL was executed:
1 data _null_;
2 call execute('proc sql; select sum(age) into: S_A from sashelp.class; quit;');
3
4 x = "&S_A.";
WARNING: Apparent symbolic reference S_A not resolved.
5 run;
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
NOTE: CALL EXECUTE generated line.
1 + proc sql;
1 + select sum(age) into: S_A from sashelp.class;
1 + quit;
NOTE: PROCEDURE SQL used (Total process time):
real time 0.00 seconds
cpu time 0.01 seconds
Proper timing when using macro language, if one does not have experience, can be hard.
If I can share an advice, despite my limitless affection to the macro language, a "golden rules" (which is a paraphrase of saying about regular expressions) which goes like this: "If you can equivalently do something with macro language and without it, do it without it." 🙂
Bart
... View more