Date:         Fri, 5 Aug 1994 09:54:33 EDT
Reply-To:     Clarence Jackson <73021.3404@COMPUSERVE.COM>
Sender:       "SAS(r) Discussion" 
From:         Clarence Jackson <73021.3404@COMPUSERVE.COM>
Subject:      Macro Tutorial (long)
To:           Multiple recipients of list SAS-L

Hi SAS-Lers,

 In responce to many on Macros, something that I put together awhile back for
our In-house users.  It's long, but I hope it can be used by someone out
there...

Clarence Jackson, City of Dallas, Texas
73021.3404@compuserve.com    or    cj@zgnews.lonestar.org
            ----


                     MACRO PAPER OUTLINE

I.    Introduction
      A. What is the Macro Facility

II.   SAS and Macro Facility Processes
      A. SAS Program Data Vector - PDV
      B. SAS code without Macro statements
      C. SAS code with Macro statements

III.  Macro Facility Overview
      A. Components of Macro Facility
         1. Macro Processor
         2. Macro Language
      B. Macro Language Components
         1. Variables
         2. Statements
         3. Functions
         4. Expressions and Text
      C. Macro Definitions and Referencing
      D. Referencing Environments
      E. Programming Statements
      F. Functions
      G. Auto Call Facility
      H. System Options

IV.   Quick Rules



                      CITY OF DALLAS MAINFRAME USERS FORUM
                             MACRO FACILITY HANDOUT
                                  MAY 12, 1988


INTRO:

The purpose of this handout is to briefly describe the Macro Facility
in BASE SAS.

The information presented in this handout is based on information found in
SAS BASICS users guide and the SAS Macro Facility Guide.

The Macro Facility was introduced with the 82 Release of BASE SAS.

II.  Process

To understand how SAS uses Macro's, we must look at how SAS processes any
statement or job.  When we execute jobs in SAS, all SAS statements are read
into the input stack, and passed thru the SAS supervisor one token at a time.
Tokens are strings separated by blanks or operators.  The SAS supervisor reads
tokens until it receives a semi-colon, which completes a SAS statement.  Once
the supervisor reads a complete statement, it checks it for syntax, and passes
the statement to the wordscanner section of the supervisor.  Here, the tokens
are examined for their value, ie if the token is a SAS reserve word, user name
and type, and passes the tokens on to the compiler.  This process continues
until a step boundary word is read. Step boundary keywords are DATA, PROC, RUN,
ENDSAS, CARDS (and it's other formats).  Then the SAS compiler compiles the code
and executes statements for that step.  In oher words, only one step is
compliled and executed independently.

Macro compilation and execution are separate processes from Data or PROC
compilation and execution.  Understanding the difference will help you to
understand Macro expression evaluation and how to make SAS work better for
you.

III. Macro Facility Overview:

Now, why do we use Macros?  Using the Macro Facility allows you to do very
interesting things with SAS that is not possible without it.  For use in
batch mode processing, SAS Macro Facility allows us to :

      . Retrieve system information from the SAS Supervisor
      . Perform conditional execution of SAS Data and Proc Step
      . Generate data-dependent SAS statements (SAS Code)
      . Communication information between SAS steps
      . Generate repetitive SAS code

The Macro Facility is a tool for extending and customizing the SAS system and
for reducing the amount of text you must enter to do common tasks.  The
Facility allows you to package small or large amounts of text into units
or modules that have names.  From that point on, you can work with the names
rather than the text itself.

When you use a Macro Facility name in a SAS program, the Macro Facility
generates SAS statements and commands as needed.  The rest of the SAS system
uses those statements and commands just like the ones you enter.

A. Components of Macro Facility

There are two components in the Macro Facility:

- The Macro processor is the portion of SAS that does the work.
- The Macro language is the language used to communicate with the Macro
processor

The Macro language has variables, program statements, expressions, and
functions - the same pieces that make up the SAS DATA step language.  However,
the Macro language uses the patterns %name and &name to trigger Macro processing
activities.

B. Macro Language Components

The components of the Macro Language are:

     Macro Variables
     Macro Statements
     Macro Functions
     Macro expressions & Constant Text

Marco variables (or symbolic variables) are different from DATA step variables
and can be defined anywhere in a SAS job, except after a CARDS, CARDS4,
PARMCARDS, or PARMCARDS4 statement.  Whereas a Data step variable is assigned
within that step, and must be carried within a SAS datafile past the step, a
Macro variables' value remains constant until changed or the end of the SAS
session.

C. Macro Definitions and Referencing

The simplest way to define and assign a value to a macro variable is to
use %LET statement, as in:
                               %LET DSN=NEWDATA;

DSN is the name of the Macro variable, and NEWDATE is its value.  To reference
the value of a Macro variable, place an "&" in front of its name, as in &DSN.
The pattern &DSN is called a "Macro variable reference".  After creation of the
Macro variable, the reference is resolved by the Macro  processor using the
&DSN.  Changing the Macro is as easy as another "%LET"
definition of the variable name.  Using the %LET statement, you can create
variables values that contain entire sections of a SAS program:

                 %LET PLOT=%STR(PROC PLOT; PLOT INCOME + AGE;);

In this case, the value of the macro variable is enclosed in the %STR Macro
function so that the semicolons within the value are part of the TEXT, not
end of the %LET statement.

%MACRO statements defines stored text by name.  The simplest type of Macro works
much like a Macro varible, but more complex code can be included.
%Macros can do many things that Macro variables cannot.

To define a %MACRO, a simple example is:

                         %MACRO DSN; NEWDATA %MEND DSN;

The "%MACRO" statement must begin every Macro and must contain a name for the
Macro (DSN), text (NEWDATA) and end with the %MEND statement.  To invoke
a Macro, place a "%" in front of its name, as in "%DSN".  The pattern
"%MACRO-NAME" is called a "Macro invocation" or a "Macro Call".  After
definition of the Macro, the call is resolved by the Macro processor by
replacing the Macro name with the text from the Macro.

As with the %LET statement, you can create Macros that contain entire sections
of SAS program:

             %MACRO PLOT; PROC PLOT; PLOT INCOME * AGE; %MEND PLOT;

Suppose that the plotting variables in the PROC PLOT step can change.  Rewrite
the names of the PLOT variables with Macro variable references, and supply
values in %LET statements before the Macro is called:

            %MACRO PLOT; PROC PLOT; PLOT &YVAR * &XVAR; %MEND PLOT;
                              %LET XVAR = INCOME;
                                 %LET YVAR=AGE;
                                     %PLOT
                              %LET XVAR = SAVINGS;
                                     %PLOT

In many cases, it becomes inconvenient to keep redefining variables using Macro
%LET statements, so define the Macro variables as part of the %MACRO statement.
This can be done using either positional or keyword parameters. The following
illustrates both styles:

positional parameters -

definition - %MACRO PLOT(XVAR,XVAR);
              PROC PLOT; PLOT &YVAR * &XVAR;
             %MEND PLOT;
call       - %PLOT(INCOME,AGE)

keyword parameters -
definition - %MACRO PLOT(YVAR=,XVAR=);
              PROC PLOT; PLOT &YVAR &VAR;
             %MEND PLOT;
call       - %PLOT(YVAR=INCOME,XVAR=AGE)

I prefer using keyword paramaters because variables defined can be assigned
default values such as:

       %MACRO PLOT(YVAR=INCOME,XVAR=AGE);
        PROC PLOT&YVAR*&XVAR;
       %MEND PLOT
       %PLOT(XVAR=SAVINGS)
       %PLOT

(Two calls are issued here. The first will produce a plot for income by
The second call will use the default value of &XVAR, 'age'.)

Macro variables can also be created during data step execution based on
within the DATA step by using the "SYMPUT" routine, and passed to the Macro
Facility to be used in other steps.  By the same token, values in the Macro
Facility can be passed to the data step by using the "SYMGET" routine.

D.  REFERENCING ENVIRONMENT:

When the System Option MACRO is in effect, SAS programs have one or more
referencing environments: a referencing environment is the area in which
variable is available for use.  Referencing environments are important because
they determine whether the MACRO processor can locate a Macro variable that is
referenced.  The two types of Referencing Environments are "GLOBAL" and "LOCAL".


The Global environment is the entire SAS job, while local environments are
within Macros.  The Macro processor uses referencing environments according to
the following rules:

1) When executing Macro program statements that can create Macro variables,
the Macro processor attempts to change the value of an existing Macro variable
regardless of environment, rather than creating a new Macro variable.

2) When executing Macro program statements that can create Macro variables, and
no Macro variable of the name requested exists, the Macro processor creates a
variable in the current environment.

3) The %GLOBAL statement causes the Macro processor to create a variable in the
global environment, regardless of the current environment.

4) %LOCAL statement and Macro paramater creates Macro variable in the current
local environment even if a variable of that name exists in another environment.


E. Programming Statements

Program statements for the Macro Language can be described as "open code" and
"closed code" statements.  Open code statements can be used outside any
definition as well as inside.  Closed code can only be used inside a Macro
definition.  All previously discussed Macro statements are open code statements.
Others include %CMS, %INPUT, %PUT, %TSO, and all Macro functions and routines.

Examples of closed code, or Inside-Macros-Only statements are %*Comment;
%WHILE, %END, %GOTO, %IF-%THEN/%ELSE, and %LABEL:  All of these statements are
the same as SAS Data Step statements except that these statements program the
Macro Processor.

Using these statements allows for:

1) Conditional execution of Macro statements and the generation of SAS code
2) Branching within a Macro
3) Supplies values for Macro variables during Macro execution and
4) Creation of Macro variables and assigning values.

F. Functions

Macro Functions process one or more Macro expressions, called arguments,
produce a new character string, the result or returned value.  They can be
either inside or outside a Macro.  There are three categories:  Character,
Evaluation, and quoting functions.

Macro character functions either change or provide information about the
character string that is their argument.  Most Macro character functions have
names that correspond to DATA step character functions, and are similar
in the way each works, except that Macro functions executes while SAS is
constructing a DATA or  PROC step.  The DATA step function executes when the
DATA STEP executes, and is treated as constant text by the Macro Processor, and
unlike DATA step functions, Macro character functions may be paried with a "Q"
for returning quoted results.

The evaluation function is %EVAL.  Because the Macro Processor is a charactor
(string) handling facility, "numbers" in Macro expressions are treated as
charactor strings.  The %EVAL function assigns numeric properties to intergers
in expressions and performs calculations using integer arithmetic.  The %EVAL
function also evaluates logical experssions such as &A=&B.

The quoting functions inthe Macro language perform the activity equivalant to
enclosing a portion of a SAS statement in single or double quotes.  That
the Macro Facility treates the expression with the function as a unit and
not  perform any evaluations  on the expression.  Quoting functions are
used to cause the Macro Processor to treat special characters as text.  Quoting
functions are necessary because the Macro processor treats single quote (') and
double quotes (") as text.

G. AutoCall Facility

The Macro Facility AUTOCALL feature allows you to store the source statements
for Macros in a file, associate the file with a SAS job or session, and call or
include the Macros as needed.  The Macro definition does not have to be part of
the current program.  By specifing the MAUTOSOURCE system options and
associating the file reference (DD) SASAUTOS with a library of Marcos, the
AUTOCALL facility will automatically define and execute a Macro when it is
called into a SAS job.  This facility is especially useful for defining your own
Macro functions, which you can store in an AUTOCALL library.  SAS provides some
special Macros in the SAS AUTOCALL library supplies with Base SAS.


H. System Options

Normally, Macro statements don't appear on the log when executed.  This ia a
problem when complex code is involved and the Macro is not working properly.
Error codes for Macros are between 1000 and 4000 indicating that problem
occurred in the Macro Facility.  System options such as IMPRINT, MLOGIC,
SYMBOLGEN and MACROGEN are available and can be used either separately or in
combination.  The options display information on the SAS log giving detail
about the compiliation or execution of a Macro.  The types of messages that is
displayed in the log depends on the option chosen.

IV. Quick Rules

There are several sets of rules in use depending on the way the Macro Facility
and SAS is used.  In the batch environment, these rules for new Macro writers
should be:

1.  Define all Macros before use, preferably at the beginning of the SAS
    or AUTOCALLed.
2.  Know your referencing environment, global, local, and current
3.  Use systems options in debugging Macros
4.  Use keyword parameters with Macro variable defaults
5.  Document Macros with %* comments;

If you have any questions, please contact Clarence Jackson, 214-670-5798
(670-3220 after 8/1/94)


Statistics

Make your visit count, load this image.

Back