BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
sskt
Quartz | Level 8

お世話になっております。
マクロ変数について理解が不十分なところがあるので2点ほど質問させていただきます。


1.マクロ名にマクロ変数は使えないか?
下のように普通に使うとエラーになります。(当たり前ですが)

%let m1=1;

%macro m&m1;
...
%mend;


2. %nrstrで渡した変数をマクロ内で展開できないか、もしできない場合はこれを可能にする方法はないか。
nrstrでマクロ変数内の&をマスクするところまではどうやらうまく行っていそうですが、

 

%macro mac( var=%nrstr(&p.s_1 - &p.s_6));
%macro sv(pre=);
/*ココ*/
&var
%mend;

%sum

%mend;

 

というプログラムですが、ココ、と書いたところに&p.s_1 - &p.s_6を書いていましたが、マクロ変数で管理したいと思い&付きの引数を作りましたがうまくいかないです。
ちなみに%svはその後の%sum内で展開されております。

マクロの中にマクロを作っているのが気持ち悪かったり、そもそも引数内に&を入れていたりするのが気持ち悪いのですがいい解決策を思いつきの方はご教示いただけると幸いです。

レベルの高くない質問で申し訳ありませんが、どうぞよろしくお願いいたします。

1 ACCEPTED SOLUTION

Accepted Solutions
yu_sas
SAS Employee

1.

%MACROステートメントのマクロ名の指定にはマクロ変数は利用できません。これはドキュメントに記載されています。

 

%MACROステートメント内では、マクロ名を生成するテキスト式は使用できません。

 

あまりきれいではありませんが、%INCLUDEステートメントを利用するのはどうかと思います。

 

%let m1=1;
filename tmp temp;
data _null_;
file tmp;
put '%macro m' "&m1;";
run;
%include tmp;
%put hello;
%mend;
%m1;

2.

マクロ定義をネストするとデバッグが困難になりますし、可能だったら他の方法を検討してもいいかもしれません。

マクロ定義はネストできますが、マクロのネストは多くの場合不要でありしかも非効率的です。あるマクロ定義をネストした場合、そのマクロを含んでいるマクロを呼び出すたびに、ネストされているマクロがコンパイルされます。多くの場合、マクロ定義をネストするのではなく、別のマクロ定義内でマクロ呼び出しをネストするだけで十分です。

 今回のような場合、%UNQUOTE関数でマスキングを解除するのはどうでしょうか。

 

%macro mac( var=%nrstr(&p.s_1 - &p.s_6));
%macro sv(p=);
data test;
length %unquote(&var) 8;
run;
%mend sv;
%sv(p=test)
%mend mac;
options mprint symbolgen;
%mac;

View solution in original post

4 REPLIES 4
yu_sas
SAS Employee

1.

%MACROステートメントのマクロ名の指定にはマクロ変数は利用できません。これはドキュメントに記載されています。

 

%MACROステートメント内では、マクロ名を生成するテキスト式は使用できません。

 

あまりきれいではありませんが、%INCLUDEステートメントを利用するのはどうかと思います。

 

%let m1=1;
filename tmp temp;
data _null_;
file tmp;
put '%macro m' "&m1;";
run;
%include tmp;
%put hello;
%mend;
%m1;

2.

マクロ定義をネストするとデバッグが困難になりますし、可能だったら他の方法を検討してもいいかもしれません。

マクロ定義はネストできますが、マクロのネストは多くの場合不要でありしかも非効率的です。あるマクロ定義をネストした場合、そのマクロを含んでいるマクロを呼び出すたびに、ネストされているマクロがコンパイルされます。多くの場合、マクロ定義をネストするのではなく、別のマクロ定義内でマクロ呼び出しをネストするだけで十分です。

 今回のような場合、%UNQUOTE関数でマスキングを解除するのはどうでしょうか。

 

%macro mac( var=%nrstr(&p.s_1 - &p.s_6));
%macro sv(p=);
data test;
length %unquote(&var) 8;
run;
%mend sv;
%sv(p=test)
%mend mac;
options mprint symbolgen;
%mac;
sskt
Quartz | Level 8

ご返信ありがとうございます。

無事、%unquoteで目的を達成できました。

 

確認なのですが、

>マクロ定義をネスト

とは%svの定義を%macの中に入れてしまっている点でしょうか?

そこが問題なのであれば%svの定義を%macの外に出そうと思います。

yu_sas
SAS Employee

そうですね。ドキュメントから引用した通りで、仕様上問題があるわけではありません。メンテナンスが大変になる場合があるので、分けたほうがいいことが多いです。

sskt
Quartz | Level 8

わかりました。

基本的な質問に答えていただき、ありがとうございました。

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

Discussion stats
  • 4 replies
  • 2050 views
  • 2 likes
  • 2 in conversation