Espacios de nombres GDL
El analizador GDL no permitirá definir una plantilla con el mismo nombre más de una vez. Dos archivos de plantilla escritos de forma independiente pueden usar accidentalmente el mismo nombre para una plantilla y impedirle incluir ambos archivos de plantilla en el archivo GDL.
Para evitar problemas de colisión de nombres, GDL admite espacios de nombres. El autor de un archivo de encabezado puede especificar a qué espacio de nombres debe pertenecer cada plantilla y definición de macro al incluir toda la definición dentro de una construcción *DefineInNameSpace. El símbolo proporcionado como nombre de instancia de esta construcción se convertirá en el espacio de nombres al que pertenecen todas las definiciones incluidas. Si una definición reside dentro de dos o más construcciones *DefineInNameSpace anidadas, solo pertenecerá al espacio de nombres definido por la construcción *DefineInNameSpace más interna. Si una definición no reside en ninguna construcción *DefineInNameSpace, se asignará al espacio de nombres predeterminado o "sin nombre".
Si las entradas que componen el cuerpo de una plantilla o construcción de macro se incluyen dentro de construcciones *DefineInNameSpace independientes, el analizador no colocará esas entradas individuales en el nuevo espacio de nombres porque las entradas individuales no son una definición independiente, por lo que no pueden vivir en un espacio de nombres diferente. Las macros de bloque permiten definiciones de macros anidadas y estas definiciones anidadas se pueden asignar a otros espacios de nombres. Sin embargo, cambiar el espacio de nombres de una definición anidada no amplía su duración. Solo se puede hacer referencia a una definición de macro anidada dentro del nivel de anidamiento en el que se definió.
Se puede hacer referencia a una plantilla o un nombre de macro en un formulario completo o no calificado en un espacio de nombres. Para calificar un nombre de plantilla o macro, el nombre del espacio de nombres simplemente se prefijo al nombre de la plantilla o macro con un carácter de dos puntos intermedios (por ejemplo, Namespace:MacroName).
Nota El nombre de símbolo proporcionado como el valor de *Template, *Macros o *BlockMacro definiciones no se puede calificar mediante un espacio de nombres. El espacio de nombres de una definición solo se puede definir mediante *DefineInNameSpace.
Por ejemplo, después de definir una plantilla denominada "TEMPNAME" dentro de un espacio de nombres denominado "NSName", esa plantilla puede hacer referencia a ella mediante otra definición de plantilla mediante el formulario calificado del espacio de nombres, como se muestra en el ejemplo de código siguiente.
*DefineInNameSpace: NSName
{
*Template: TEMPNAME
{
*% member attributes
}
}
Ahora se puede hacer referencia a esta plantilla desde otra plantilla mediante la sintaxis calificada del espacio de nombres, como se muestra en el ejemplo de código siguiente.
*Template: ANOTHER_TEMPLATE
{
*Inherits: NSName:TEMPNAME
}
Si la mayoría de las referencias de plantilla harán referencia al mismo espacio de nombres o si no hay ninguna colisión de nombres entre los nombres de plantilla a los que se hace referencia dentro de dos o más espacios de nombres, puede omitir el calificador de espacio de nombres y proporcionar solo el nombre de la plantilla y confiar en el analizador para buscar una lista de espacios de nombres hasta que se encuentre una plantilla coincidente.
La lista de espacios de nombres se especifica mediante la inclusión de una o varias entradas de GDL dentro de las construcciones *UsingNameSpace. Si alguna de estas entradas contiene referencias no calificadas a una plantilla o macro, la resolución de esas referencias se verá afectada por las construcciones *UsingNameSpace. El símbolo que se proporciona como nombre de instancia de esta construcción identifica el espacio de nombres que se va a buscar.
Puede especificar varios espacios de nombres anidando varias construcciones. El orden de búsqueda comienza con la construcción *UsingNameSpace más interna y continúa hacia fuera. Si se encuentra una definición de plantilla en un espacio de nombres especificado, la búsqueda se detiene y se usa esa plantilla. Si no se ha encontrado ninguna coincidencia después de buscar todos los espacios de nombres especificados explícitamente, el analizador buscará en el espacio de nombres denominado en cada construcción *DefineInNameSpace de la construcción más interna hacia afuera. Y si esa búsqueda no resuelve la referencia, intentará buscar en el espacio de nombres "sin nombre".
Nota Si necesita aislar el orden de búsqueda del espacio de nombres de influencias externas, se deben especificar todos los espacios de nombres necesarios para resolver las referencias mediante las construcciones *UsingNameSpace.
No debe basarse en la construcción *DefineInNameSpace para establecer el orden de búsqueda, ya que el host podría rodear el archivo incluido con construcciones *UsingNameSpace adicionales y se buscarán los espacios de nombres especificados por el host antes de los espacios de nombres denominados por las construcciones *DefineInNameSpace.
Por ejemplo, la plantilla que se definió anteriormente mostró dos espacios de nombres que se han especificado explícitamente para usarse para la resolución de nombres de plantilla. Cualquier espacio de nombres denominado por *UsingNameSpace debe haber sido definido previamente por *DefineInNameSpace. La excepción es el espacio de nombres "sin nombre", que siempre existe y se denomina mediante el símbolo NULL.
En el ejemplo de código siguiente se muestra cómo especificar el espacio de nombres "sin nombre" para definir el orden de búsqueda.
*UsingNameSpace: NSName2
{
*UsingNameSpace: *%%%%% omitting symbol specifies the Unnamed
*% Namespace.
{
*UsingNameSpace: NSName
{
*Template: ANOTHER_TEMPLATE
{
*Inherits: TEMPNAME
}
}
}
}
En el ejemplo anterior, se buscará el espacio de nombres "sin nombre" después de que se hayan producido errores en todas las búsquedas del espacio de nombres especificado explícitamente, pero el ejemplo especifica explícitamente que se buscará en el espacio de nombres "sin nombre" antes del espacio de nombres NSName2.
Dado que las entradas de datos de GDL nunca hacen referencia explícitamente a los nombres de plantilla, el uso de *UsingNameSpace no afectará a qué plantilla se asigna a cada entrada de datos. Sin embargo, el orden de búsqueda del espacio de nombres que *UsingNameSpace especifica (que está en vigor en el momento en que se analiza la primera entrada de datos GDL) se usa en la búsqueda de la plantilla ROOT. Si va a incluir uno o varios archivos de encabezado GDL, debe asegurarse de que no se conviertan accidentalmente en el primero en definir una entrada de datos y, por tanto, determinar qué espacio de nombres se usa para buscar la plantilla ROOT.
Nota Las definiciones de macros están limitadas por el nivel de anidamiento envolvente. Sin embargo, los niveles de anidamiento de espacios de nombres no limitan el ámbito de las definiciones de macros porque no es necesario definir una macro para pertenecer a un espacio de nombres determinado si el ámbito de la macro no es lo suficientemente grande como para ser visible fuera de ese espacio de nombres.
Las construcciones de espacio de nombres se pueden intercalar entre otros tipos de construcciones. Casi no hay ninguna restricción sobre dónde puede aparecer una construcción de espacio de nombres. Las construcciones que no son de espacio de nombres no afectan a la resolución del espacio de nombres.