Condividi tramite


Spazi dei nomi GDL

Il parser GDL non consentirà di definire più volte un modello con lo stesso nome. Due file modello scritti in modo indipendente possono inavvertitamente usare lo stesso nome per un modello e impedire l'inclusione di entrambi questi file modello nel file GDL.

Per evitare problemi di collisione dei nomi, GDL supporta gli spazi dei nomi. L'autore di un file di intestazione può specificare lo spazio dei nomi a cui deve appartenere ogni modello e definizione di macro racchiudendo l'intera definizione all'interno di un costrutto *DefineInNameSpace. Il simbolo fornito come nome dell'istanza di questo costrutto diventerà lo spazio dei nomi a cui appartengono tutte le definizioni racchiuse. Se una definizione si trova all'interno di due o più costrutti *DefineInNameSpace annidati, appartiene solo allo spazio dei nomi definito dal costrutto *DefineInNameSpace più interno. Se una definizione non si trova all'interno di alcun costrutto *DefineInNameSpace, verrà assegnata allo spazio dei nomi predefinito o senza nome.

Se le voci che costituiscono il corpo di un modello o di un costrutto di macro sono racchiuse all'interno di costrutti *DefineInNameSpace separati, il parser non inserisce tali singole voci nello spazio dei nomi nuovo perché le singole voci non sono una definizione separata, pertanto non possono risiedere in uno spazio dei nomi diverso. Le macro di blocco consentono definizioni di macro annidate e queste definizioni nidificate possono essere assegnate ad altri spazi dei nomi. Tuttavia, la modifica dello spazio dei nomi di una definizione nidificata non estende la durata. È possibile fare riferimento a una definizione di macro annidata solo all'interno del livello di annidamento in cui è stato definito.

È possibile fare riferimento a un modello o un nome di macro in un formato qualificato o non qualificato in uno spazio dei nomi. Per qualificare un modello o un nome di macro, il nome dello spazio dei nomi è semplicemente preceduto dal nome del modello o della macro con un carattere di due punti, ad esempio Namespace:MacroName.

Nota Il nome del simbolo specificato come valore di *Template, *Macros o *BlockMacro definitions non può essere qualificato da uno spazio dei nomi. Lo spazio dei nomi di una definizione può essere definito solo usando *DefineInNameSpace.

Ad esempio, dopo che un modello denominato "TEMPNAME" è stato definito all'interno di uno spazio dei nomi denominato "NSName", tale modello può essere fatto riferimento da un'altra definizione di modello usando il modulo completo dello spazio dei nomi, come illustrato nell'esempio di codice seguente.

*DefineInNameSpace: NSName
{
    *Template:  TEMPNAME
    {
        *%  member attributes
    }
}

È ora possibile fare riferimento a questo modello da un altro modello usando la sintassi qualificata dello spazio dei nomi, come illustrato nell'esempio di codice seguente.

*Template:  ANOTHER_TEMPLATE
{
    *Inherits: NSName:TEMPNAME
}

Se la maggior parte dei riferimenti al modello farà riferimento allo stesso spazio dei nomi o se non esiste un conflitto di nomi tra nomi a cui si fa riferimento all'interno di due o più spazi dei nomi, è possibile omettere il qualificatore dello spazio dei nomi e specificare solo il nome del modello e fare affidamento sul parser per cercare un elenco di spazi dei nomi fino a quando non viene trovato un modello corrispondente.

L'elenco degli spazi dei nomi viene specificato racchiudendo una o più voci GDL all'interno di costrutti *UsingNameSpace. Se una di queste voci contiene riferimenti non qualificati a un modello o a una macro, la risoluzione di tali riferimenti sarà interessata dai costrutti *UsingNameSpace. Il simbolo fornito come nome dell'istanza di questo costrutto identifica lo spazio dei nomi in cui eseguire la ricerca.

È possibile specificare più spazi dei nomi annidando diversi costrutti. L'ordine di ricerca inizia con il costrutto *UsingNameSpace più interno e procede verso l'esterno. Se una definizione di modello viene trovata in uno spazio dei nomi specificato, la ricerca viene arrestata e viene usato tale modello. Se non viene trovata alcuna corrispondenza dopo la ricerca di tutti gli spazi dei nomi specificati in modo esplicito, il parser cercherà lo spazio dei nomi denominato in ogni costrutto *DefineInNameSpace racchiuso tra costrutti più interni verso l'esterno. Se la ricerca non riesce a risolvere il riferimento, tenterà di cercare lo spazio dei nomi "senza nome".

Nota Se è necessario isolare l'ordine di ricerca dello spazio dei nomi dalle influenze esterne, è necessario specificare tutti gli spazi dei nomi necessari per risolvere i riferimenti usando i costrutti *UsingNameSpace.

Non è consigliabile basarsi sul costrutto *DefineInNameSpace per stabilire l'ordine di ricerca perché l'host potrebbe racchiudere il file incluso con costrutti *UsingNameSpace aggiuntivi e gli spazi dei nomi specificati dall'host verranno cercati prima degli spazi dei nomi denominati dai costrutti *DefineInNameSpace.

Ad esempio, il modello definito in precedenza mostra due spazi dei nomi specificati in modo esplicito da usare per la risoluzione dei nomi del modello. Qualsiasi spazio dei nomi denominato da *UsingNameSpace deve essere stato definito in precedenza da *DefineInNameSpace. L'eccezione è lo spazio dei nomi "senza nome", che esiste sempre ed è denominato dal simbolo NULL.

Nell'esempio di codice seguente viene illustrato come specificare lo spazio dei nomi "senza nome" per definire l'ordine di ricerca.

*UsingNameSpace: NSName2
{
    *UsingNameSpace:  *%%%%%  omitting symbol specifies the  Unnamed 
*%  Namespace.
    {
        *UsingNameSpace: NSName
        {
            *Template:  ANOTHER_TEMPLATE
            {
                *Inherits: TEMPNAME
            }
        }
    }
}

Nell'esempio precedente, lo spazio dei nomi "senza nome" verrà cercato dopo che tutte le ricerche nello spazio dei nomi specificato in modo esplicito non sono riuscite, ma l'esempio specifica in modo esplicito che lo spazio dei nomi "senza nome" viene cercato prima dello spazio dei nomi NSName2.

Poiché le voci di dati GDL non fanno mai riferimento in modo esplicito ai nomi dei modelli, l'uso di *UsingNameSpace non influirà sul modello assegnato a ogni voce di dati. Tuttavia, l'ordine di ricerca dello spazio dei nomi specificato da *UsingNameSpace (che è attivo al momento dell'analisi della prima voce di dati GDL) viene usato nella ricerca del modello ROOT. Se si includono uno o più file di intestazione GDL, è necessario assicurarsi che non diventino inavvertitamente il primo a definire una voce di dati e quindi determinare quale spazio dei nomi viene usato per trovare il modello ROOT.

Nota Le definizioni di macro sono limitate dall'ambito del livello di annidamento di inclusione. Tuttavia, i livelli di annidamento dello spazio dei nomi non limitano l'ambito delle definizioni di macro perché non è necessario definire una macro che appartenga a uno spazio dei nomi specifico se l'ambito della macro non è sufficientemente grande da essere visibile all'esterno di tale spazio dei nomi.

I costrutti dello spazio dei nomi possono essere interleavati tra altri tipi di costrutti. Non esiste quasi alcuna restrizione per la visualizzazione di un costrutto dello spazio dei nomi. I costrutti non dello spazio dei nomi non influiscono sulla risoluzione dello spazio dei nomi.