2014-12-17 15 views
6

Ho sempre pensato che %let crea una variabile local se utilizzato all'interno di %macro . . . %mendperché% non consente di creare una variabile macro locale?

Ma quando si esegue questo codice, il registro SAS mostra GLOBAL TESTVAR value1

%let testVar = value2; 
%macro test; 
%let testVar = value1; 
%mend; 

%test 

%put _all_; 

Quindi, non riesco a capire il motivo per cui il valore di la variabile globale testVar è stata modificata in value1. Mi aspettavo che fosse invariato value2. L'istruzione %let all'interno di %macro dovrebbe avere avuto un impatto SOLO sulla tabella dei simboli locale.

SAS documentation says:

Quando il processore macro esegue un'istruzione programma macro che può creare una variabile macro, il processore macro crea la variabile nella tabella dei simboli locale se nessuna variabile macro con lo stesso nome è a disposizione di it

risposta

7

La chiave è "se nessuna variabile macro con lo stesso nome è disponibile" - in questo caso, è disponibile una variabile macro con lo stesso nome, perché hai già definito testVar come globale.

è possibile dargli un nome che non è condiviso con una globale, o esplicitamente dichiararlo come locali:

%let testVar = value2; 
%macro test; 
    %local testVar; 
    %let testVar = value1; 
%mend; 

%test 
+0

Grazie, ho capito ora. Sono stato confuso con l'esempio SAS: '% let new = inventry; % macro nome2; % let new = report; . . ' – Alex

+2

@Alex Dovresti sempre dichiarare esplicitamente le variabili nelle macro come locali (se ti aspetti che siano locali). Non riuscendo a farlo può portare a qualche difficile codice di debug se la tua macro capita di chiamare altre macro (o viene chiamata da un'altra macro). –

Problemi correlati