LISTSERV at the University of Georgia
Menubar Imagemap
Home Browse Manage Request Manuals Register
Previous messageNext messagePrevious in topicNext in topicPrevious by same authorNext by same authorPrevious page (October 2002, week 4)Back to main SAS-L pageJoin or leave SAS-L (or change settings)ReplyPost a new messageSearchProportional fontNon-proportional font
Date:         Tue, 22 Oct 2002 11:40:17 -0400
Reply-To:     Ian Whitlock <WHITLOI1@WESTAT.COM>
Sender:       "SAS(r) Discussion" <SAS-L@LISTSERV.UGA.EDU>
From:         Ian Whitlock <WHITLOI1@WESTAT.COM>
Subject:      Re: Macro variable in Macro Name
Comments: To: Bill Anderson <wnilesanderson@COX.NET>
Content-Type: text/plain; charset="iso-8859-1"

Bill,

No macro references are resolved between %MACRO and %MEND. Hence you cannot have a variable named macro.

On the other hand there is no need have a variable name for one macro. At least, I cannot conceive of one. You probably want several macros (all with fixed names) and to be able to use a variable to specify which of the macros you want to execute. This can be quite useful.

Here is code to illustrate, that works fine in version 8.2 and 6.12.

%let suffix = ABC;

%macro thatabc;

%put THATABC executing ;

%mend;

%that&suffix

Somewhere between version 6.06 and 8.2, the resolution of the variable in the macro name was considered a bug, since it didn't do that in version 5. If you are operating with a system from this period, then you can use

%unquote(%nrstr(%THAT)&suffix)

or

%let mac = that&suffix ; %&mac

Both work by forcing the resolution of &SUFFIX before calling the macro. The second works because the bug was only partially fixed during period where it was "fixed". Their advantage in 8.2 is that they are version independent. Due to screaming the bug was revived, but I am not sure in what version.

IanWhitlock@westat.com

-----Original Message----- From: Bill Anderson [mailto:wnilesanderson@COX.NET] Sent: Tuesday, October 22, 2002 11:12 AM To: SAS-L@LISTSERV.UGA.EDU Subject: Macro variable in Macro Name

I would like to be able to name a macro, according to the value of a macro variable that is defined before the macro code. Here is a very abbreviated version of the code I tried.

%let suffix = ABC;

%macro that&suffix;

/* SAS code; */

%mend;

The intention is the the compiled macro would have the name thatABC, and then the statement %thatABC would invoke the macro. But the SAS macro compiler balks, and the log contains the messages:

ERROR: Expected semicolon not found. The macro will not be compiled.

ERROR: A dummy macro will be compiled.

According to the SAS MACRO manual (version 8, page 23), "You can use these [macro variable] references anywhere in a SAS program". I have learned to take this statement with a grain of salt, and the above situation seems to be another example. Any suggestions would be appreciated.

One might wonder why I would want to do such a thing. The reason is that I have a bunch of files which perform the same logical operation, although the specific macro code is quite different from file to file. (Actually about 10 different algorithms for data imputation, and I want details of the specific algorithm to remain hidden in the individual files.) I want to preserve as much parallelism as possible, and I successfully use the suffix in titles, variable labels, SAS data set names, and external file names. I would like to to be able to do the same thing with the macro names, but have come to the above described sticky point.


Back to: Top of message | Previous page | Main SAS-L page