Compartilhar via


Argumentos de macro GDL

O conteúdo de uma definição de macro pode referenciar todos, alguns ou nenhum de seus argumentos formais, especialmente para definições de macro de valor, em que várias definições de macro de valor podem ocorrer em um constructo *Macros com uma única lista de argumentos formais que é compartilhada por todas as definições. Nesse caso, uma definição pode referenciar alguns dos argumentos formais, enquanto outra faz referência a nenhum.

Se uma definição de macro omitir referências a um ou mais argumentos formais, a lista de parâmetros fornecida quando a macro for referenciada poderá indicar esses parâmetros ausentes por vírgulas (,) que não separam nada.

Por exemplo, a referência de macro a seguir usa apenas o quinto argumento. Os quatro primeiros são omitidos.

*Attribute: =Macro(,,,, =PassedInMacroRef)

Você não precisa indicar parâmetros omitidos à direita. Se a macro no exemplo anterior declarasse 10 argumentos formais, mas referenciasse apenas o quinto argumento, o exemplo anterior ainda seria uma maneira válida de referenciar a macro.

Para macros de valor, nenhum espaço em branco é permitido entre a referência de macro e sua lista de parâmetros. Essa sintaxe permite que o analisador distingue entre uma referência de macro que não usa argumentos que são seguidos por algo que se parece com uma lista de parâmetros de uma referência de macro que usa uma lista de parâmetros.

Por exemplo, considere o exemplo de código a seguir.

*Attrib:   =Macro1 (=Macro2)       *%  is 2 separate macro references
    while
*Attrib:   =Macro1(=Macro2)        *% you are passing Macro2 as a 
    *%  parameter  to Macro1.

Se as definições de macro estiverem aninhadas, os argumentos formais só poderão ser usados pelo conteúdo da macro que declarou os argumentos. O conteúdo das definições de macro aninhadas não pode referenciar os argumentos que a macro delimitador define.

As referências de macro que ocorrem dentro de uma definição de macro podem conter listas de parâmetros que nomeiam macros que exigem listas de parâmetros. No entanto, uma lista de parâmetros não pode ser fornecida para referências a argumentos formais. Por exemplo, a entrada a seguir dentro de uma definição de macro de bloco é aceitável.

*Attrib1: =Macro1(=Macro2(=Macro3(=Arg1, =Arg2)))

No exemplo anterior, =MacroN representa uma referência a uma macro de valor definida anteriormente e =ArgN representa uma referência a um argumento formal.

No entanto, o exemplo de código a seguir não é uma entrada aceitável.

*Attrib2: =Arg1(=Arg2, =Arg3(=Macro1, =Macro2))   *%  Not Valid !

Se uma referência de macro corresponder a um nome de argumento formal que a macro declara, você poderá supor que ela é uma referência a esse argumento formal, independentemente de uma macro real existir com esse nome. Você pode evitar essas ambiguidades usando um qualificador de namespace com a referência de macro. No entanto, você não pode usar qualificadores de namespace com argumentos formais.

Para macros de valor, se nenhuma lista de argumentos formal tiver sido declarada no constructo *Macros, qualquer referência às macros definidas dentro não deverá ser seguida com uma lista de parâmetros. Essa lista não será considerada parte da referência de macro.

Por exemplo, considere se =Macro1 é definido pelo exemplo de código a seguir.

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

Em seguida, a referência de macro a seguir será interpretada como três referências de macro separadas e não relacionadas.

*attribute:  =Macro1(=Macro2, =Macro3)

O analisador não interpretará (=Macro2, =Macro3) como uma lista de parâmetros para =Macro1. Esse comportamento preserva a compatibilidade com versões anteriores com GPDs atuais.