2017-10-17 427 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,或者通過減少引用量來確定如何處理概念和輸入。

注意:數字索引的宏變量有時稱爲「宏數組」。帶符號後綴的宏變量有時稱爲「宏關聯數組」或「宏對象」。