Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il parser GDL non consentirà di definire più volte un modello con lo stesso nome. Due file modello scritti in modo indipendente possono usare inavvertitamente lo stesso nome per un modello e impedire l'inclusione di entrambi i file modello nel file GDL.
Per evitare problemi di collisione dei nomi, GDL supporta i namespace. L'autore di un file di intestazione può specificare a quale spazio dei nomi ogni modello e definizione di macro deve appartenere 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 comprendono 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, quindi 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 namespace. Tuttavia, la modifica dello spazio dei nomi di una definizione annidata non ne 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 nome di modello o macro in forma qualificata o non qualificata 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 intermedi, ad esempio Namespace:MacroName.
Nota Il nome del simbolo fornito come valore di *Template, *Macros o *BlockMacro definizioni non può essere qualificato da un namespace. 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 di modello farà riferimento allo stesso spazio dei nomi o se non esiste un conflitto di nomi tra nomi a cui viene fatto 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 un costrutto *UsingNameSpace. Se una di queste voci contiene riferimenti non qualificati a un modello o a una macro, la risoluzione di tali riferimenti sarà influenzata dai costrutti *UsingNameSpace. Il simbolo fornito come nome dell'istanza di questo costrutto identifica lo spazio dei nomi da cercare.
È possibile specificare più namespace annidando più 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 si arresta e viene usato il modello. Se non viene trovata alcuna corrispondenza dopo la ricerca di tutti i namespace specificati in modo esplicito, il parser cercherà nel namespace nominato in ogni costrutto *DefineInNameSpace, procedendo dal costrutto più interno verso quello 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 ha mostrato due namespace che sono stati specificati in modo esplicito da utilizzarsi 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 è in vigore al momento dell'analisi della prima voce di dati GDL, viene utilizzato per la ricerca del template ROOT. Se si include 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 di accessibilità del livello di annidamento circostante. Tuttavia, i livelli di annidamento dello spazio dei nomi non limitano l'ambito delle definizioni di macro perché non è necessario definire una macro per appartenere 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 intercalati tra altri tipi di costrutti. Non esiste quasi alcuna restrizione sulla posizione in cui può apparire un costrutto dello spazio dei nomi. I costrutti non nello namespace non influiscono sulla risoluzione del namespace.