Compartilhar via


Macros de valor GDL

As macros de valor são usadas para representar todo ou parte de um valor. Eles são definidos dentro do constructo *Macros. Você pode definir várias macros em um constructo.

Cada entrada dentro do constructo *Macros é uma macro separada. O palavra-chave da entrada se torna o nome da macro de valor e o valor da entrada se torna o conteúdo dessa macro de valor. O nome da macro deve ser um tipo de nome de símbolo. O conteúdo de uma macro de valor pode ser qualquer coisa que adere à sintaxe GDL válida para um valor.

Macros de valor podem fazer referência a outras macros de valor. O nome da instância do constructo *Macros pode conter uma marca que é seguida por uma lista de argumentos formais entre parênteses. Qualquer referência a qualquer argumento formal por qualquer uma das definições de macro no constructo *Macros é simbolicamente substituída pelo parâmetro correspondente que é passado quando a macro de valor é realmente referenciada.

Nota As declarações e referências de argumentos que serão usados para passar referências de macro de valor são prefixadas com o sinal de igual (=) para significar que o tipo de argumento é uma macro de valor. Todas as referências a macros de valor também são prefixadas com o sinal de igual (=) para significar que a referência é para uma macro de valor em vez de uma macro de bloco. O sinal de igual deve ser imediatamente seguido pelo nome da macro de valor e nenhum espaço em branco intervindo é permitido. Referências a macros de valor podem aninhar listas de parâmetros para profundidade arbitrária.

Exemplos de macro

Todas as definições de macro de valor devem ser reconhecidas como entidade de valor completa e válida.

O exemplo de código a seguir mostra como usar macros de valor.

*Macros:
{
    InvalidMacro: "First Half of a string
}

InvalidMacro não é válido porque o contexto de cadeia de caracteres entre aspas deve ser encerrado com uma aspa dupla. Essa cadeia de caracteres não concluída não é um valor completo.

Se você quiser representar uma entidade de valor incompleta, use o exemplo de código a seguir.

*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."

O código a seguir mostra como 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.
}

O código a seguir mostra como usar referências de macro com parâmetros.

*BadOutput: =String1(=result1)
*GoodOutput: =String1(=adverb1(=adverb1(=result2, =result3), =adverb2(=result5)))

O analisador expandirá as referências de macro anteriores para produzir o código a seguir.

*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.

As referências de macro de valor não são reconhecidas em todos os contextos de valor. Por exemplo, macros de valor não são reconhecidas dentro do valor arbitrário ou contextos de cadeia de caracteres entre aspas. Mas as macros de valor são reconhecidas dentro de contextos de cadeia de caracteres hexadecimais que podem residir dentro do contexto de cadeia de caracteres entre aspas.

Para fornecer compatibilidade com versões anteriores com GPD, o sinal de porcentagem (%) é interpretado para significar que ele introduz um contexto de parâmetro de comando quando o sinal de porcentagem é usado em um contexto de valor de espaço em branco não literal dentro do conteúdo de uma definição de macro de valor. Em outras palavras, evite usar o sinal de porcentagem dentro de uma definição de macro de valor, a menos que você esteja definindo um parâmetro de comando ou o sinal de porcentagem esteja contido em um contexto de espaço em branco literal, como <Begin/EndValue>.

O conteúdo de uma definição de macro é interpretado apenas quando a macro é referenciada fora de qualquer definição de macro. Nesse momento, a macro referenciada é substituída por seu conteúdo e o conteúdo é interpretado de fato. Se o conteúdo contiver uma referência de macro, essa referência será substituída por seu conteúdo e a interpretação continuará com o conteúdo dessa macro.

Você deve pensar no analisador como agindo em um único fluxo de entrada. Quando uma referência de macro é detectada fora de qualquer definição de macro, a referência de macro é removida do fluxo de entrada e substituída por seu conteúdo, e a análise do fluxo de entrada continua com o conteúdo da macro.

Considere a macro a seguir.

*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

A macro anterior será expandida para o código a seguir.

*Print1:  "
*Print2:  " This is enclosed
*Print3:  by quotes."
*Print4:  " This is enclosed <not a hex string!> by quotes."

Observe que o resultado expandido não é GDL sintaticamente legal.