Macros de valor de GDL
Las macros de valor se usan para representar todo o parte de un valor. Se definen dentro de la construcción *Macros. Puede definir varias macros dentro de una construcción.
Cada entrada dentro de la construcción *Macros es una macro independiente. La palabra clave de la entrada se convierte en el nombre de la macro de valor y el valor de la entrada se convierte en el contenido de esa macro de valor. El nombre de la macro debe ser un tipo de nombre de símbolo. El contenido de una macro de valor puede ser cualquier cosa que se ajuste a la sintaxis de GDL válida para un valor.
Las macros de valor pueden hacer referencia a otras macros de valor. El nombre de instancia de la construcción *Macros puede contener una etiqueta seguida de una lista de argumentos formales entre paréntesis. Cualquier referencia a cualquier argumento formal por cualquiera de las definiciones de macros de la construcción *Macros se reemplaza simbólicamente por el parámetro correspondiente que se pasa cuando realmente se hace referencia a la macro de valor.
Nota Las declaraciones y referencias de argumentos que se usarán para pasar referencias de macro de valor tienen como prefijo el signo igual (=) para indicar que el tipo de argumento es una macro de valor. Todas las referencias a macros de valor también tienen como prefijo el signo igual (=) para indicar que la referencia es a una macro de valor en lugar de a una macro de bloque. El signo igual debe seguir inmediatamente el nombre de la macro de valor y no se permite ningún espacio en blanco intermedio. Las referencias a macros de valor pueden anidar listas de parámetros a profundidad arbitraria.
Ejemplos de macros
Todas las definiciones de macro de valor deben reconocerse como entidad de valor completa y válida.
En el ejemplo de código siguiente se muestra cómo usar macros de valor.
*Macros:
{
InvalidMacro: "First Half of a string
}
InvalidMacro no es válido porque el contexto de cadena entre comillas debe terminarse con una comilla doble. Esta cadena noterminada no es un valor completo.
Si desea representar una entidad de valor incompleta, use el ejemplo de código siguiente.
*Macros:
{
FirstHalf: <BeginValue:Q>"This is the first half <EndValue:Q>
SecondHalf: <BeginValue:Q>of the string."<EndValue:Q>
}
*FullString: =FirstHalf=SecondHalf
*% *FullString now expands to generate the complete string:
*FullString: "This is the first half of the string."
En el código siguiente se muestra cómo usar argumentos de macro.
*Macros: FormalArgs(=arg1, =arg2)
{
result1: disappointed
result2: pleased
result3: impressed
result4: awestruck
result5: restrained
adverb1: very =arg1 and =arg2
adverb2: while remaining =arg1
String1: The audience was =arg1 with today's performance.
}
En el código siguiente se muestra cómo usar referencias de macros con parámetros.
*BadOutput: =String1(=result1)
*GoodOutput: =String1(=adverb1(=adverb1(=result2, =result3), =adverb2(=result5)))
El analizador expandirá las referencias de macro anteriores para generar el código siguiente.
*BadOutput: The audience was disappointed with today's performance.
*GoodOutput: The audience was very, very pleased and impressed and while remaining restrained with today's performance.
Las referencias a macros de valor no se reconocen en todos los contextos de valor. Por ejemplo, las macros de valor no se reconocen dentro del valor arbitrario ni de los contextos de cadena entre comillas. Pero las macros de valor se reconocen dentro de contextos de cadena hexadecimal que podrían residir dentro del contexto de cadena entre comillas.
Para proporcionar compatibilidad con gpD con versiones anteriores, el signo de porcentaje (%) se interpreta para indicar que introduce un contexto de parámetro de comando cuando se usa el signo de porcentaje en un contexto de valor de espacio en blanco no literal dentro del contenido de una definición de macro de valor. En otras palabras, evite usar el signo de porcentaje dentro de una definición de macro de valor a menos que defina un parámetro de comando o el signo de porcentaje esté contenido en un contexto de espacio en blanco literal, como <Begin/EndValue>.
El contenido de una definición de macro se interpreta realmente solo cuando se hace referencia a la macro fuera de cualquier definición de macro. En ese momento, la macro a la que se hace referencia se reemplaza por su contenido y el contenido se interpreta realmente. Si el contenido contiene una referencia de macro, esa referencia se reemplaza por su contenido y su interpretación continúa por el contenido de esa macro.
Debería pensar en el analizador como actuar en un único flujo de entrada. Cuando se detecta una referencia de macro fuera de cualquier definición de macro, la referencia de macro se quita del flujo de entrada y se reemplaza por su contenido y el análisis de la secuencia de entrada continúa con el contenido de la macro.
Tenga en cuenta la macro siguiente.
*Macros:
{
quote: <BeginValue:x>"<EndValue:x>
first_half: =quote This is enclosed
second_half: by quotes.=quote
whole_string: =first_half <not a hex string!> =second_half
}
*Print1: =quote
*Print2: =first_half
*Print3: =second_half
*Print4: =whole_string
La macro anterior se expandirá al código siguiente.
*Print1: "
*Print2: " This is enclosed
*Print3: by quotes."
*Print4: " This is enclosed <not a hex string!> by quotes."
Tenga en cuenta que el resultado expandido no es GDL sintácticamente legal.