尝试创建一个宏来检查宏变量是否存在并在不存在时创建它
Trying to create a macro which checks for a macro variable existence and creates it if doesn't exist
%Macro symexistchk(valuex);
%if %symexist(&valuex) %then %put &valuex;
%else %do; %let valuex = 0;
%end;
%Mend symexistchk;
%symexistchk(g900_r);
我想检查宏变量 g900_r 是否存在,如果不存在则创建一个。
谢谢,
山姆
您几乎成功了...您错过了 2 件关键的事情。您需要包含 %global 语句以将宏声明为全局宏变量。这将使它在宏之外可用。您还遗漏了 %let 语句中的 &
,您将其分配为零。
你的最终代码应该是这样的:
%Macro symexistchk(valuex);
%if %symexist(&valuex) %then %do;
%put Macro Variable &valuex exists.;
%end;
%else %do;
%global &valuex;
%let &valuex = 0; * NOTE THE AMPERSAND TO THE LEFT OF THE EQUALS SIGN;
%put Macro Variable &valuex created and initialized to zero.;
%end;
%Mend symexistchk;
%symexistchk(g900_r);
%put &g900_r;
您需要使用 %global
将新创建的宏分配给全局范围,在 %let
语句中解析您的宏变量参数(因此您不只是创建一个名为 valuex 的变量)和 evaluate the resolved macro variable 在你的 %put
声明中 &&&
.
%macro symexistchk(valuex);
%if %symexist(&valuex.) %then %put Already exists: &valuex = &&&valuex;
%else %do;
/* Make macro variable available outside macro */
%global &valuex.;
%let &valuex. = 0;
%put Assigning: &valuex = &&&valuex;
%end;
%mend symexistchk;
%symexistchk(mVar);
%symexistchk(mVar);
%Macro symexistchk(valuex);
%if %symexist(&valuex) %then %put &valuex;
%else %do; %let valuex = 0;
%end;
%Mend symexistchk;
%symexistchk(g900_r);
我想检查宏变量 g900_r 是否存在,如果不存在则创建一个。
谢谢, 山姆
您几乎成功了...您错过了 2 件关键的事情。您需要包含 %global 语句以将宏声明为全局宏变量。这将使它在宏之外可用。您还遗漏了 %let 语句中的 &
,您将其分配为零。
你的最终代码应该是这样的:
%Macro symexistchk(valuex);
%if %symexist(&valuex) %then %do;
%put Macro Variable &valuex exists.;
%end;
%else %do;
%global &valuex;
%let &valuex = 0; * NOTE THE AMPERSAND TO THE LEFT OF THE EQUALS SIGN;
%put Macro Variable &valuex created and initialized to zero.;
%end;
%Mend symexistchk;
%symexistchk(g900_r);
%put &g900_r;
您需要使用 %global
将新创建的宏分配给全局范围,在 %let
语句中解析您的宏变量参数(因此您不只是创建一个名为 valuex 的变量)和 evaluate the resolved macro variable 在你的 %put
声明中 &&&
.
%macro symexistchk(valuex);
%if %symexist(&valuex.) %then %put Already exists: &valuex = &&&valuex;
%else %do;
/* Make macro variable available outside macro */
%global &valuex.;
%let &valuex. = 0;
%put Assigning: &valuex = &&&valuex;
%end;
%mend symexistchk;
%symexistchk(mVar);
%symexistchk(mVar);