SAS allows the programmer to declare the scope of macro variables using %LOCAL or %GLOBAL, but the macros themselves are always created in the global scope.
Say you have a macro that in another language, say Python, would be considered a function. Within the macro you want a sub-macro (i.e., sub-function) to be used only within the outer macro.
%macro outer; %put NOTE: outer; /* This "sub-macro" is defined within the outer macro and is intended only for use within the outer macro. */ %macro inner(foo); %put NOTE: inner &foo; %mend; %inner(1); %inner(2); %mend; %outer; /* If the "sub-macro" has a local scope, the next step would fail */ %inner(3); /* However, it succeeds */
This can lead to conflicts if the macro %inner is defined somewhere else in the same session. One way of dealing with this is to be careful to give the inner macro a unique name like __outer_inner where the underscores in the prefix suggest a local scope, and adding outer to the macro name indicates the macro is to be used only in the outer macro.
Another option is to use the %sysmacdelete to delete the inner macro:
%macro outer; %put NOTE: outer; %macro inner(foo); %put NOTE: inner &foo; %mend; %inner(1); %inner(2); /* Delete the inner macro */ %SYSMACDELETE inner; %mend; %outer; /* This fails because of SYSMACDELETE */ %inner(3);
Tested with SAS 9.4M3 on Windows 7.
No comments:
Post a Comment