Descripción general (DEFECTO-!ENDDEFINE, mandato)
DEFINE—!ENDDEFINE define una macro de programa, que luego se puede utilizar dentro de una secuencia de mandatos. Una macro puede ser útil en varios contextos diferentes. Por ejemplo, se puede utilizar para:
- Emita una serie de mandatos iguales o similares repetidamente, utilizando construcciones en bucle en lugar de especificaciones redundantes.
- Especifique un conjunto de variables.
- Generar salida de varios procedimientos de programa con un único mandato.
- Cree programas de entrada complejos, especificaciones de procedimiento o sesiones completas que se puedan ejecutar.
Una macro se define especificando cualquier parte de un mandato válido y asignándole un nombre de macro. A continuación, este nombre se especifica en una llamada de macro dentro de una secuencia de mandatos. Cuando el programa encuentra el nombre de la macro, expande la macro.
En los ejemplos de definición de macro a lo largo de esta referencia, el nombre de macro, el cuerpo y los argumentos se muestran en minúsculas para facilitar la lectura. Las palabras clave de macro, que siempre van precedidas de un signo de exclamación (!), se muestran en mayúsculas.
Opciones
Argumentos de macro. Puede declarar y utilizar argumentos en la definición de macro y, a continuación, asignar valores específicos a estos argumentos en la llamada de macro. Puede definir valores predeterminados para los argumentos e indicar si un argumento debe expandirse cuando se llama a la macro. Consulte el tema Argumentos de macro (DEFINE-!ENDDEFINE, mandato) para obtener más información.
Directivas macro. Puede activar y desactivar la expansión de macro. Consulte el tema Directivas de macro (DEFINE-!ENDDEFINE, mandato) para obtener más información.
Funciones de manipulación de series. Puede procesar una o más series de caracteres y producir una serie de caracteres nueva o una representación de caracteres de un resultado numérico. Consulte el tema Funciones de manipulación de series (DEFINE-!ENDDEFINE, mandato) para obtener más información.
Proceso condicional. Puede crear construcciones condicionales y en bucle. Consulte el tema Proceso condicional (DEFINE-!ENDDEFINE, mandato) para obtener más información.
Variables de macro. Puede asignar directamente valores a variables de macro. Consulte el tema Asignación directa de variables de macro (DEFINE-!ENDDEFINE, mandato) para obtener más información.
Especificación básica
Todas las macros deben empezar por DEFINE y finalizar por !ENDDEFINE. Estos mandatos identifican el principio y el final de una definición de macro y se utilizan para separar la definición de macro del resto de la secuencia de mandatos.
- Inmediatamente después de
DEFINE, especifique el nombre de macro. Todas las macros deben tener un nombre. El nombre se utiliza en la llamada de macro para hacer referencia a la macro. Los nombres de macro pueden empezar con un signo de exclamación (!), pero aparte de esto, siguen los convenios de denominación habituales. Inicio de un nombre con un! garantiza que no estará en conflicto con el resto de texto o variables de la sesión. - Inmediatamente después del nombre de macro, especifique una definición argumento opcional entre paréntesis. Esta especificación indica los argumentos que se leerán cuando se llame a la macro. Si no desea incluir argumentos, especifique sólo los paréntesis; los paréntesis son necesarios, tanto si encierran un argumento como si no.
- A continuación, especifique el cuerpo de la macro. El cuerpo de macro puede incluir mandatos, partes de mandatos o sentencias de macro (directivas de macro, sentencias de manipulación de series y sentencias de bucle y de proceso condicional).
- Al final del cuerpo de la macro, especifique
!ENDDEFINE.
Para invocar la macro, emita un llamada de macro en la secuencia de mandatos. Para llamar a una macro, especifique el nombre de la macro y los argumentos necesarios. Si no hay argumentos, sólo es necesario el nombre de macro.
Operaciones
- Cuando el programa lee la definición de macro, convierte en mayúsculas todo el texto (excepto los argumentos) no entre comillas. Los argumentos se leen en mayúsculas y minúsculas.
- El recurso de macro no crea ni ejecuta mandatos, sino que expande series en un proceso denominado expansión de macro. Una llamada de macro inicia la expansión de la macro. Después de expandir las series, los mandatos (o partes de los mandatos) que contienen las series expandidas se ejecutan como parte de la secuencia de mandatos.
- Los elementos de la llamada de macro que no se utilizan en la expansión de macro se leen y se combinan con las series expandidas.
- Las series expandidas y los elementos restantes de la llamada de macro, si los hay, deben ajustarse a las reglas de sintaxis del programa. Si no es así, el programa genera un aviso o un mensaje de error, en función de la naturaleza del problema de sintaxis.
Reglas de la sintaxis
Al igual que otros mandatos, las macros expandidas deben ajustarse a las reglas de la modalidad de proceso bajo la que se ejecutan. Aunque es deseable crear una sintaxis de macro que se ejecute tanto en el modo interactivo como en el modo por lotes, esto puede a veces añadir una capa de complejidad que puede que desee evitar. Por lo tanto, se recomienda escribir sintaxis de macro que se ajuste a las reglas de sintaxis interactivas y estructurar los trabajos para ejecutar sintaxis de macro bajo reglas de sintaxis interactivas.
DEFINEy!ENDDEFINEdeben estar escritos en su totalidad. No se pueden abreviar.- La sentencia
!ENDDEFINEde macro debe finalizar con un punto. Un punto como el último carácter de una línea se interpreta como un terminador de mandatos en modalidad interactiva. - Otras sentencias de macro (por ejemplo,
!IF,!LOOP,!LET) no deben finalizar con un punto. - El texto dentro del cuerpo de la macro que representa los comandos que se generarán cuando se expanda la macro debe incluir el punto al final de cada comando, y cada comando debe comenzar en una nueva línea.
El cuerpo de la macro no puede contener los caracteres \ o ^ a menos que estén contenidos en una serie entrecomillada, como en "a valid
backslash \ in a quoted string".
Ejemplo
DEFINE !macro1(type = !DEFAULT(1) !TOKENS(1)
/varlist=!CMDEND)
!IF (!type = 1)!THEN
frequencies variables=!varlist.
!ELSE
descriptives variables=!varlist.
!IFEND
!ENDDEFINE.
- Las sentencias de macro
DEFINE,!IF,!ELSEy!IFENDno terminan con un punto. !ENDDEFINEfinaliza con un punto.- Los mandatos
FREQUENCIESyDESCRIPTIVESgenerados por la macro empiezan cada uno en una línea nueva y finalizan con un punto.
Para estructurar los trabajos de sintaxis de mandatos de modo que las reglas de proceso interactivas se utilicen siempre en lugar de las reglas de proceso por lotes:
- Utilice
INSERTen lugar deINCLUDEpara combinar archivos de mandatos que contengan macros con otros archivos de mandatos. Consulte el tema INSERT para obtener más información. - En los trabajos del recurso de producción, seleccione Interactivo para el formato de entrada de sintaxis. Consulte el tema Trabajos de producción para obtener más información.
- En Batch Facility (disponible sólo con IBM® SPSS® Statistics Server), utilice el modificador -i para utilizar reglas de procesamiento interactivo.
Compatibilidad
Las mejoras de la función de macros pueden provocar errores en las tareas que antes se ejecutaban sin errores. Especialmente, en el caso de la sintaxis que se procesa con reglas interactivas, si se produce una llamada de macro al final de un comando, y no hay ningún terminador del comando (un punto o una línea en blanco), el siguiente comando que siga a la expansión de la macro se interpretará como una línea de continuación en lugar de como un comando nuevo, como en:
DEFINE !macro1()
var1 var2 var3
!ENDDEFINE.
FREQUENCIES VARIABLES = !macro1
DESCRIPTIVES VARIABLES = !macro1.
En el modo interactivo, el comando DESCRIPTIVES se interpretará como una continuación del comando FREQUENCIES y no se ejecutará ningún comando.
Limitaciones
- Los mandatos
BEGIN DATA—END DATAno están permitidos en una macro. - Los mandatos
BEGIN PROGRAM-END PROGRAMno están soportados en una macro. - El mandato
DEFINEno está permitido en una macro.