sas MACRO y ampersand

%let test = one; %let one = two; %put &test; %put &&test; %put &&&test; %put &&&&test; %put &&&&&test; 

Bien. Estoy TOTALMENTE GOLPEADO por estos símbolos. No entiendo por qué necesitan TANTOS ampersands antes de una variable macro. ¿Hay algún truco para dominar el uso de ampersand? Por cierto, ¿cuáles son los cinco resultados, en consecuencia?

Con un solo juego de símbolos, lo que obtienes es bastante aburrido; después de la una, el número impar de ampersands conduce a la resolución dos veces, incluso el número de ampersands se resuelve una vez. Por lo tanto, usa 1 signo de unión para resolver una vez y 3 signos de unión para resolver dos veces, a menos que tenga acciones en la empresa que posee los derechos sobre el símbolo.

Más interesante es la siguiente prueba, que muestra por qué incluso los números de signos y entrenamientos tienen valor:

 %let test = one; %let testtwo = one; %let one = two; %let two=three; %put &test&one; %put &&test&one; %put &&&test&one; %put &&&&test&one; %put &&&&&test&one; %put &&&&&&test&one; 

Básicamente, cada pase, SAS hace lo siguiente:

  • Resuelva cualquier ampersand más texto a una referencia de macro variable.
  • Resuelve cualquier par de signos y signos en un símbolo comercial.

Esos se realizan simultáneamente e iterativamente hasta que todos los signos y signos se hayan ido, y cada resultado se guarda para la siguiente iteración y no afecta la iteración actual. Entonces, &test&one convierte en onetwo porque &test -> uno y &one -> dos. Pasos para el rest:

  • &&test&one -> &testtwo -> one . &&|test|&one . El doble && antes de la prueba se convierte en & , la prueba permanece, y &one resuelve en two . Eso deja &testtwo para el segundo pase que se resuelve en one .
  • &&&test&one -> &onetwo -> no se resuelve. &&|&test|&one -> &|one|two -> DNR.
  • &&&&test&one -> &&testtwo -> &testtwo -> one. &&|&&|test|&one -> &&|testtwo -> &testtwo -> one. Cada uno de dos pares se reduce a uno, formando un par, que luego se resuelve en uno, lo que deja &testtwo a resolver.
  • &&&&&test&one es similar a tres ampersand case, pero con un par adicional.
  • &&&&&&test&one resuelve &&&testtwo resuelve &one resuelve a dos. &&|&&|&&|test|&one -> &&|&testtwo -> &one -> two. El número impar de pares significa que obtenemos un conjunto más de resuelve.

Al final del día, lo que necesita recordar:

  • 1 ampersand resuelve la variable de macro una vez y ya está.
  • 2 ampersands es útil para variables compuestas de macro, es decir, un prefijo más un sufijo de macro ( &&prefix&suffix ).
  • 3 ampersands es útil para profundizar dos en la resolución de una sola variable de macro ( &&&var -> &var2 -> var3 ).
  • 6 ampersands es útil para resolver una macrovariable compuesta de dos profundidades (es decir, combinando 2 y 3) ([ &prefix=var , &suffix=2 ] &&&&&&prefix&suffix -> &&&var2 -> &var3 -> 4 ).

Más allá de eso, 4 o más (aparte de 6) son útiles solo para combinaciones particularmente complejas; los niveles adicionales se usarían para retrasar la resolución hasta determinados momentos.

    Intereting Posts