Argumentos de macro de GDL
El contenido de una definición de macro puede hacer referencia a todos, algunos o ninguno de sus argumentos formales, especialmente para las definiciones de macros de valor, donde se pueden producir varias definiciones de macros de valor dentro de una *Construcción de macros con una lista de argumentos formal única compartida por todas las definiciones. En este caso, una definición puede hacer referencia a algunos de los argumentos formales, mientras que otro no hace referencia a ninguno.
Si una definición de macro omite referencias a uno o varios argumentos formales, la lista de parámetros que se proporciona cuando se hace referencia a la macro puede indicar los parámetros que faltan por comas (,) que no separan nada.
Por ejemplo, la siguiente referencia de macro usa solo el quinto argumento. Se omiten los cuatro primeros.
*Attribute: =Macro(,,,, =PassedInMacroRef)
No es necesario indicar parámetros omitidos finales en absoluto. Si la macro del ejemplo anterior declaraba 10 argumentos formales, pero solo hacía referencia al quinto argumento, el ejemplo anterior seguiría siendo una manera válida de hacer referencia a la macro.
Para las macros de valor, no se permite ningún espacio en blanco entre la referencia de macro y su lista de parámetros. Esta sintaxis permite que el analizador distinga entre una referencia de macro que no usa argumentos que se produzcan seguidos de algo similar a una lista de parámetros de una referencia de macros que use una lista de parámetros.
Por ejemplo, considere el ejemplo de código siguiente.
*Attrib: =Macro1 (=Macro2) *% is 2 separate macro references
while
*Attrib: =Macro1(=Macro2) *% you are passing Macro2 as a
*% parameter to Macro1.
Si las definiciones de macro están anidadas, solo el contenido de la macro que declaró los argumentos puede usar los argumentos formales. El contenido de las definiciones de macros anidadas no puede hacer referencia a los argumentos que define la macro envolvente.
Las referencias de macro que se producen dentro de una definición de macro pueden contener listas de parámetros que asignan nombres a macros que requieren listas de parámetros. Sin embargo, no se puede proporcionar una lista de parámetros para referencias a argumentos formales. Por ejemplo, la siguiente entrada dentro de una definición de macro de bloque es aceptable.
*Attrib1: =Macro1(=Macro2(=Macro3(=Arg1, =Arg2)))
En el ejemplo anterior, =MacroN representa una referencia a una macro de valor previamente definida y =ArgN representa una referencia a un argumento formal.
Sin embargo, el siguiente ejemplo de código no es una entrada aceptable.
*Attrib2: =Arg1(=Arg2, =Arg3(=Macro1, =Macro2)) *% Not Valid !
Si una referencia de macro coincide con un nombre de argumento formal que declara la macro, puede suponer que es una referencia a ese argumento formal, independientemente de si existe una macro real con ese nombre. Puede evitar estas ambigüedades mediante un calificador de espacio de nombres con la referencia de macro. Sin embargo, no puede usar calificadores de espacio de nombres con argumentos formales.
En el caso de las macros de valor, si no se declaró ninguna lista de argumentos formal en la construcción *Macros, no se debe seguir ninguna referencia a las macros definidas en con una lista de parámetros. Dicha lista no se considerará parte de la referencia de macro.
Por ejemplo, considere si =Macro1 está definido por el ejemplo de código siguiente.
*Macros: NoArgList
{
Macro1: "a Value macro with no argument list"
Macro2: "a Value macro with no argument list"
Macro3: "a Value macro with no argument list"
}
A continuación, la siguiente referencia de macro se interpretará como tres referencias de macro independientes y no relacionadas.
*attribute: =Macro1(=Macro2, =Macro3)
El analizador no interpretará (=Macro2, =Macro3) para que sea una lista de parámetros para =Macro1. Este comportamiento conserva la compatibilidad con versiones anteriores con los GPD actuales.