Hay dos aspectos del código de macro en SAS para ser definidas: el código de macro que se compila y los parámetros de la macro:
código de macro:
El El código macro en sí es muy simple, ya que cuando se encuentra el token %macro
, el sistema SAS comienza a compilar una macro SAS y continúa compilando hasta que llega a un token %mend
. Los únicos problemas reales que puede enfrentar es si actualizó el código de macro y no lo vuelve a compilar antes de ejecutarlo; en estas situaciones, seguirá ejecutando la versión anterior que tiene en la biblioteca de macros. Por extensión, si intenta compilar una macro que llama a otra macro que aún no ha sido definida, entonces obtendrá un error. Por estas razones, necesitan ser programado en el orden en que se llaman (como se muestra en debajo de ejemplo:% level3 viene antes% level2, que viene antes% level1)
variables de macro: Al definir macro variables hay dos ámbitos: Global y Local. Una vez definidas, se puede acceder a las variables globales en cualquier lugar y en cualquier momento. Sin embargo, las variables locales solo existen localmente durante la ejecución de la macro en la que se ha definido.Por extensión, si la macro que se ha definido la variable local llama a cualquier otro macros, la macro variable local, seguirá siendo accesible:
Ejemplo de trabajo:
En el siguiente ejemplo, los macros son definido en orden inverso para evitar que SAS devuelva un invocación aparente de macro advertencia.
El siguiente diagrama ilustra la estructura de las siguientes macros en el siguiente ejemplo:
|-----------------------------|
|GLOBAL |
| |------------------------| |
| |LEVEL1 | |
| | |-------------------| | |
| | |LEVEL2 | | |
| | | |--------------| | | |
| | | | LEVEL3 | | | |
| | | |--------------| | | |
| | |-------------------| | |
| |------------------------| |
|-----------------------------|
Compilar las macros anidadas:
%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 ;
Compilar el macro nivel superior (que a su vez llama a la anteriormente dos macros) y ejecútelo:
%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 ;
Puntos a tener en cuenta al revisar th correo de registro:
- Fuera de% nivel3, & me devuelve una advertencia de que la variable macro no no existe
- Dentro% nivel3, cuando & G1 se llama, se devuelve el valor almacenado en el ámbito local de% level3.Once fuera de% level3, el valor devuelve al valor almacenado globalmente
Técnicamente hablando, la biblioteca de llamada automática no carga las macros 'de antemano'. Si el usuario intenta ejecutar una macro y esa macro aún no se ha definido, entonces SAS comenzará a buscarla en la biblioteca de llamada automática. Si encuentra con éxito un nombre de archivo que coincida con la llamada, y ese archivo contiene un nombre de macro que coincida con la llamada, solo entonces compilará la macro. Si luego realiza cambios en ese archivo en la biblioteca de llamada automática, deberá volver a enviar el código manualmente para que esos cambios estén disponibles en una sesión SAS interactiva. –