Ci sono due aspetti di codice di macro in SAS da definire: il codice della macro che viene compilato e i parametri macro:
codice macro:
Il il codice macro stesso è molto semplice in quanto quando si incontra il token %macro
, il sistema SAS inizia a compilare una macro SAS e continua a compilare finché non raggiunge un token %mend
. L'unico vero problema che si può incontrare è se si aggiorna il codice macro e non lo si ricompila prima di eseguirlo - in queste situazioni verrà comunque eseguita la vecchia versione che ha nella libreria delle macro. Per estensione, se si tenta di compilare una macro che chiama un'altra macro che non è già stata definita, si otterrà un errore. Per questi motivi, devono essere programmate nell'ordine in cui essi sono chiamati (come mostrato nell'esempio di seguito:% level3 viene prima% level2, che viene prima% level1)
variabili macro: Nel definire macro variabili ci sono due ambiti: Globale e Locale. Una volta definite, le variabili globali sono accessibili ovunque e in qualsiasi momento. Tuttavia, le variabili locali esistono solo localmente durante l'esecuzione della macro in cui è stata definita.Per estensione, se la macro in cui è stata definita la variabile locale chiama altre macro, la variabile macro locale sarà ancora accessibile:
di lavoro Esempio:
Nel seguente esempio, le macro sono definite, in ordine inverso per impedire a SAS di restituire un avviso apparente della macro.
Lo schema seguente illustra la struttura dei seguenti macro nel seguente esempio:
|-----------------------------|
|GLOBAL |
| |------------------------| |
| |LEVEL1 | |
| | |-------------------| | |
| | |LEVEL2 | | |
| | | |--------------| | | |
| | | | LEVEL3 | | | |
| | | |--------------| | | |
| | |-------------------| | |
| |------------------------| |
|-----------------------------|
Compilare le macro nidificate:
%macro level3 ;
%put **** START LEVEL3 **** ;
%local G1;
%let G1=Local ;
%do i=1 %to 2 ;
%put In the macro do loop I=&i ;
%end ;
%put The value of I at level3 is: &I ;
%put Are we accessing global or local G1 variable here: &G1 ;
%put **** END LEVEL3 ****;
%mend level3 ;
%macro level2 ;
%put **** START LEVEL2 **** ;
%*global L1 ; *<-- this would produce an error because the variable name has already been added to the local scope in %level1 ;
%put Are we accessing global or local G1 variable here: &G1 ;
%put Can we access local variables here: &L1 ;
%level3 ;
%put The value of I in level2 is: &I ;
%put **** END LEVEL2 ****;
%mend level2 ;
compilazione macro livello superiore (che a sua volta richiama il sopra due macro) ed eseguirlo:
%let G1=Global;
%macro level1 ;
%put **** START LEVEL1 **** ;
%let L1=Yes;
%put Are we accessing global or local G1 variable here: &G1 ;
%put Can we access local variables here: &L1 ;
%level2 ;
%put The value of I outside of the local macro is: &I ;
%put Are we accessing global or local G1 variable here: &G1 ;
%put **** END LEVEL1 ****;
%mend level1 ;
%level1 ;
Punti da notare durante la revisione di e registro:
- Al di fuori di% Level3, & mi restituisce un avviso che la variabile macro non non esiste
- All'interno% Level3, quando & G1 viene chiamato, restituisce il valore memorizzato in l'ambito locale di% level3.Un'esterno di% level3, il valore restituisce al valore memorizzato globalmente
Tecnicamente parlando, la libreria di autocall non carica 'before-hand' macro. Se l'utente tenta di eseguire una macro e quella macro non è già stata definita, allora SAS inizierà a cercarla nella libreria di autocall. Se trova correttamente un nome file che corrisponde alla chiamata e quel file contiene un nome di macro che corrisponde alla chiamata, solo allora compilerà la macro. Se si apportano modifiche a tale file nella libreria di autocall, sarà necessario inviare nuovamente il codice manualmente affinché tali modifiche diventino disponibili in una sessione SAS interattiva. –