在宏变量名称SAS中解析包含%eval的宏

AP3*_*P30 2 variables macros eval sas

这是一个玩具示例,以帮助解决我遇到的更大问题.它主要涉及在引用更大的宏变量名时使用%eval()宏.

我创建了一个宏变量x_2,它使用循环的值'&it',变量被成功创建,如最终输出所示,但是我只能将它放到日志中而不评估&it + 1,使用大于1的循环时我需要做.

它似乎首先解决x_,发出警告,然后再评估x_2作为一个整体并给出输出.

我意识到这只是一个关于如何正确引用宏的问题,但我找不到任何使用评估作为宏变量名称的一部分的示例.

谢谢.

%macro testing;

%DO it = 1 %TO 1; 

data dataset;
    s=100;
    t=99;
run;

data _null_;
    set dataset;
    if s = 100 then do;
        call symput("x_%eval(&it+1)",t);
    end;
run;

%put "&x_%eval(&it+1)";

%put &x_2;

%END;

%mend testing;

%testing;
Run Code Online (Sandbox Code Playgroud)

日志输出

MLOGIC(TESTING):  %PUT "&x_%eval(&it+1)"

WARNING: Apparent symbolic reference X_ not resolved.

SYMBOLGEN:  Macro variable IT resolves to 1

SYMBOLGEN:  Macro variable X_2 resolves to           99

"          99"

MLOGIC(TESTING):  %PUT &x_2

SYMBOLGEN:  Macro variable X_2 resolves to           99

99

MLOGIC(TESTING):  %DO loop index variable IT is now 2; loop will not iterate again.

MLOGIC(TESTING):  Ending execution.
Run Code Online (Sandbox Code Playgroud)

Dir*_*ten 5

实际上,SAS在调用%eval函数之前执行变量替换最简单的解决方案是在之前的语句中调用%eval

%let xNr = %eval(&it+1);
%put "&&x_&xNr";
Run Code Online (Sandbox Code Playgroud)

双&符号用于延迟评估x_&xNr直到&xNr评估到2并且没有x_未定义的警告.

SYMBOLGEN:  Macro variable IT resolves to 1
SYMBOLGEN:  && resolves to &.
SYMBOLGEN:  Macro variable XNR resolves to 2
SYMBOLGEN:  Macro variable X_2 resolves to           99
"          99"
Run Code Online (Sandbox Code Playgroud)