Ho trovato questa pagina SO molto utile durante il tentativo di risolvere un problema correlato all'ambito della variabile macro. why doesn't %let create a local macro variable?Perché non sono le variabili macro SAS Ambito locale per impostazione predefinita?
Quindi, per riassumere, la scrittura %let x = [];
o %do x = [] %to [];
in una macro:
- creare un locale ambito macro variabile x se non c'è un "x" già nella tabella dei simboli globale, o
- aggiorna la variabile macro globale "x" se una "x" è nella tabella dei simboli globale
Questo mi sembra molto non intuitivo. Sarei disposto a scommettere che ci sono un sacco di bug nella zona selvaggia SAS a causa di questa scelta progettuale. Raramente vedo% istruzioni locali in macro, anche sopra istruzioni di loop usando nomi di variabili comuni come "i" o "counter". Per esempio, ho appena tirato sulla prima carta con la parola "macro" nel titolo da questo elenco di Sugi e SAS Forum Globale carte http://www.lexjansen.com/cgi-bin/xsl_transform.php?x=sgf2015&c=sugi
E in effetti, ho trovato questo codice nel primo documento convegno SAS ho aperto :
%macro flag;
data CLAIMS;
set CLAIMS;
%do j= 1 %to 3;
if icd9px&j in (&codelist)
then _prostate=1;
%end;
run;
%mend;
%flag;
http://support.sas.com/resources/papers/proceedings15/1340-2015.pdf
Guai a chi chiama% bandiera e ha anche la propria variabile & j. Potrebbero facilmente finire senza errori di log ma risultati fasulli perché il loro & j è 4 ovunque dopo aver chiamato% flag, che sarà (dall'esperienza) un bug che non è divertente rintracciare. O peggio, potrebbero non riconoscere mai che i loro risultati sono falsi.
Quindi la mia domanda è: perché è stata presa la decisione di non avere tutte le variabili macro come scope locali di default? Ci sono dei buoni motivi per cui l'ambito delle variabili macro SAS funziona come fa?
Questa è una domanda interessante ma potrebbe essere off/topic per s.o. poiché ora può esserci una risposta giusta, è vicina all'opinione. Suggerire di chiedere a communities.sas.com o SAS-L, entrambi hanno più discussioni. Detto questo, sono d'accordo con te sul fatto che le regole di scoping non sono intuitive e hanno un'alta probabilità di causare bug in natura. – Quentin
Grazie per il suggerimento Quentin. Sulla base della descrizione del tag "language-design" e dei tipi di domande che vedo qui per quel tag, non pensavo che questa domanda sarebbe fuori tema su SO. Forse lo posterò su uno dei siti che hai citato anche tu. –
Un buon punto per quanto riguarda il tag di design della lingua, avrei pensato che molte di quelle domande fossero off-topic. (Anche quando pensavo che fosse OT, stavo ancora scrivendo una risposta.) – Quentin