2017-10-17 27 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です。コードの{ここで}起こる}部分で私が使用するAPPLEに解決します。しかし、SASは私に警告を与えています "警告:見かけ上のシンボリックリファレンスMAX_は解決していません。" DGマクロ変数は、& & max_1〜& & max_17を返しています。 & DGを呼び出します。この時点で& & max_1が返されますが、これはAPPLEに解決されますが、これは表示されないコードの構文では機能しません。

& DGとなるようにマクロ変数を作成する方法を考えてください。 APPLEが返されますか?

+1

別の&を先頭に追加します。 – Reeza

答えて

2

(これは答えではありませんが、コメントに書式設定されたコードを投稿することはできません。後でこの投稿を編集/削除します)

ここに投稿したコードはあなたの犯人ではありません。私はそのままでそれを取る場合は、前のカップルの変数を初期化し、stuff happens%put声明置く:あなたは/これを貼り付けて、それを実行してコピーすることができますし、期待通り、それはあなたのログに「APPLE」を出力します

%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を使用するか、呼び出し元のスコープでマクロの解決を行うか、引用の量を減らしてコンセプトと入力をどのように処理するかを決定できます。

注:数値索引付きマクロ変数は、「マクロ配列」と呼ばれることもあります。記号で後置されたマクロ変数は、「マクロ連想配列」または「マクロオブジェクト」と呼ばれることがあります。

関連する問題