我正在尝试使用 %LET 语句创建一个局部宏变量,其值是一个宏变量,需要多个 & 符号才能解析。 SAS 在分配局部宏变量的名称之前不会解析多个 & 符号。
%macro example;
%do i=1 %to %sysevalf(&max_n);
%let dg= &&max_&i..;
{stuff happens here}
%end;
%mend;
%example;
例如,&max_1. 解析为我在代码的 {stuff 发生在这里} 部分中使用的 APPLE。 但是,SAS 给了我警告"警告:明显的象征性引用MAX_未解决。"DG 宏变量通过 &&max_1 返回 &&max_17。呼叫 &DG。此时将返回 &&max_1 它将自行解析为 APPLE,但这不适用于我没有显示的代码中的语法。
知道如何制作宏变量以便 &DG. 返回 APPLE?
(我知道这不是答案,但我无法在评论中发布格式化的代码。之后我会编辑/删除这篇文章)。
您在此处发布的代码不是您的罪魁祸首。如果我按原样,请在前面初始化几个变量,并在stuff happens
的地方放置一个%put
语句:
%let max_1=APPLE;
%let max_n=1;
%macro example;
%do i=1 %to %sysevalf(&max_n);
%let dg= &&max_&i..;
%put &dg;
%end;
%mend;
%example;
您可以复制/粘贴它并运行它,它会按预期将"APPLE"打印到您的日志中。
您尝试做的事情一定还有更多导致您的问题的原因。
此外,宏变量在调用宏的宏执行时间之前不会解析(或不需要存在于父范围或当前作用域中)。 因此,max_1和max_n的分配可以在宏定义之后和 %example 之前进行。
您遇到的行为可能是由于在宏调用之前对变量应用了宏引用。 您可以在被调用方作用域的宏中使用 %unquote,也可以在调用方作用域的宏分辨率上使用 %unquote,或者确定如何处理概念和输入,减少引用量。
注意:数字索引宏变量有时称为"宏数组"。 以符号为后缀的宏变量有时称为"宏关联数组"或"宏对象"