2017-10-17 426 views
0

我试图用%LET语句创建本地宏变量,其值是需要多个&符号来解析的宏变量。在分配本地宏变量的名称之前,SAS不解析多个&符号。SAS定义具有双连字宏变量的%LET宏变量

%macro example; 
%do i=1 %to %sysevalf(&max_n); 
    %let dg= &&max_&i..; 
    {stuff happens here} 
%end; 
%mend; 
%example; 

例如,& max_1。解决了我在{stuff stuff here}部分代码中使用的APPLE。但是,SAS给我的警告 “警告:明显的符号引用MAX_未解决。” 并且DG宏变量正在返回& & max_1到& & max_17。拨打& DG。在这一点上将返回max_1,它将自行解析为APPLE,但这不适用于我没有显示的代码中的语法。

任何想法如何使宏变量,使& DG。会返回APPLE?

+1

在它前面添加另一个&。 – Reeza

回答

2

(我知道这不是一个答案,但我不能在评论中发布格式化的代码,我将在之后编辑/删除此帖子)

你在这里发布的代码不是你的罪魁祸首。如果我把它原样,初始化前几个变量,把一个%put声明,其中stuff happens

预期
%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; 

您可以复制/粘贴,并运行它,它会打印“苹果”到你的日志。

必须有更多的东西,你正在试图做的,这是造成你的问题。

+0

此外,在宏调用时,直到宏执行时间,宏变量才被解析(或不需要存在于父或当前范围中)。因此,max_1和max_n的赋值可以发生在宏定义之后和%例子之前。 – Richard

+0

对。在这种情况下没有太大的区别。 – user2877959

+0

你说得对。我不再收到错误。我所做的只是关闭并重新打开SAS。我不确定是什么搞砸了。我再也没有收到警告。 –

1

另外,宏调用时,宏变量未被解析(或不需要存在于父或当前作用域中)直到宏执行时间。因此,max_1和max_n的赋值可以发生在宏定义之后和%例子之前。

您遇到的行为可能是由于您在宏调用之前应用于变量的宏引用引起的。您可以在被调用者范围的宏中使用%unquote,也可以在调用者范围的宏解析时使用%unquote,或者通过减少引用量来确定如何处理概念和输入。

注意:数字索引的宏变量有时称为“宏数组”。带符号后缀的宏变量有时称为“宏关联数组”或“宏对象”。